在文件中写入退格键
Writing a backspace in a file
int main(){
std::cout << "Insert file name / or path. \n NOTE: ONLY INPUTS. DELETES PREVIOUS DATA.\nV.6" << std::endl;
std::string filen;
std::cin >> filen;
std::ofstream myFile;
try{
myFile.open(filen, std::ios::out);
}
catch(std::fstream::failure){
std::cout << "Could not open file!\n Make sure the name and data type are valid.";
system("pause");
}
while(true){
int press = getch();
if(press == 43) myFile.close();
if(press == 8){myFile << "\b" << " " << "\b";std::cout << "\b" << " " << "\b" << std::flush;}
if(press == 13){ myFile << "\n"; std::cout << "\n" << std::flush;}
if(press != 43 && press != 127 && press != 13 && press != 8){myFile << (char)press;std::cout << (char)press;}
}
return 0;
}
每当我选择一个文本文件并按退格键并检查文档时,当我检查文本文档时,我会得到如下随机字符:
那些不是"random characters";那些是退格字符!即,正是您提供的输入。
这可以使用十六进制编辑器进行验证(或通过 hexdump
等管道传输程序的输出)。
如果您希望复制普通 shell 的行为,您必须编写自己的代码来识别退格字符,而不是将其附加到 myFile
,而是消除之前输入的字符.
正如@BoundaryImposition 已经指出的那样,将 "\b"
写入您的文件,实际上会将一个二进制退格字符写入您的文件。您可能想要的是 myFile.seekp(-1, std::ios_base::cur);
。如果你在 win/dos 机器上,你可能需要格外小心 '\n'
字符,因为它们在写入文本流时会被翻译成 0x0d 0x0a
(因此它们需要返回 2 个位置而不是 1 个).
但一般来说,如果您不处理非常大的文件,将内容存储在 std::string
中会更容易(使用 pop_back
或 erase
,以如果需要删除字符)并在完成后将其写入文件。
int main(){
std::cout << "Insert file name / or path. \n NOTE: ONLY INPUTS. DELETES PREVIOUS DATA.\nV.6" << std::endl;
std::string filen;
std::cin >> filen;
std::ofstream myFile;
try{
myFile.open(filen, std::ios::out);
}
catch(std::fstream::failure){
std::cout << "Could not open file!\n Make sure the name and data type are valid.";
system("pause");
}
while(true){
int press = getch();
if(press == 43) myFile.close();
if(press == 8){myFile << "\b" << " " << "\b";std::cout << "\b" << " " << "\b" << std::flush;}
if(press == 13){ myFile << "\n"; std::cout << "\n" << std::flush;}
if(press != 43 && press != 127 && press != 13 && press != 8){myFile << (char)press;std::cout << (char)press;}
}
return 0;
}
每当我选择一个文本文件并按退格键并检查文档时,当我检查文本文档时,我会得到如下随机字符:
那些不是"random characters";那些是退格字符!即,正是您提供的输入。
这可以使用十六进制编辑器进行验证(或通过 hexdump
等管道传输程序的输出)。
如果您希望复制普通 shell 的行为,您必须编写自己的代码来识别退格字符,而不是将其附加到 myFile
,而是消除之前输入的字符.
正如@BoundaryImposition 已经指出的那样,将 "\b"
写入您的文件,实际上会将一个二进制退格字符写入您的文件。您可能想要的是 myFile.seekp(-1, std::ios_base::cur);
。如果你在 win/dos 机器上,你可能需要格外小心 '\n'
字符,因为它们在写入文本流时会被翻译成 0x0d 0x0a
(因此它们需要返回 2 个位置而不是 1 个).
但一般来说,如果您不处理非常大的文件,将内容存储在 std::string
中会更容易(使用 pop_back
或 erase
,以如果需要删除字符)并在完成后将其写入文件。