在文件中写入退格键

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_backerase,以如果需要删除字符)并在完成后将其写入文件。