在文件中写入退格

时间:2017-04-08 19:19:52

标签: c++ c++11 fstream

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

2 个答案:

答案 0 :(得分:4)

那些不是&#34;随机字符&#34 ;;那些是退格人物!即你提供的输入。

这可以使用十六进制编辑器进行验证(或通过hexdump等方式管理程序输出。)

如果您希望复制常见shell的行为,您必须编写自己的代码来识别退格符,而不是将其附加到myFile,而是删除之前输入的字符

答案 1 :(得分:2)

正如@BoundaryImposition指出的那样,将"\b"写入您的文件,实际上会将二进制退格符写入您的文件。您可能需要的是myFile.seekp(-1, std::ios_base::cur);。如果你在win / dos机器上,你可能需要额外注意'\n'个字符,因为它们在写入文本流时会被翻译成0x0d 0x0a(因此它们需要找回2个位置而不是1个)。

但一般情况下,如果您不处理非常大的文件,将内容存储在std::string(使用pop_backerase,以删除字符会更容易如果需要)并在完成后将其写入文件。