【问题标题】:Writing a backspace in a file在文件中写入退格键
【发布时间】:2017-04-08 19:19:51
【问题描述】:
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;
}

每当我选择一个文本文件并按退格键时,我会检查文档,当我检查文本文档时,我会得到如下随机字符:

【问题讨论】:

  • 题外话:您需要为流打开例外。默认情况下,流不会抛出。一般来说,没有输入错误会更好,因为输入错误太常见了,不能被认为是异常的。您可以通过测试对象if (!myFile) 将进入if 的主体来测试流操作是否成功,如果流报告了错误。如果您认为无论如何都需要例外,请阅读以下内容:en.cppreference.com/w/cpp/io/basic_ios/exceptions

标签: c++ c++11 fstream


【解决方案1】:

那些不是“随机字符”;这些是退格字符!即正是您提供的输入。

这可以通过十六进制编辑器进行验证(或通过hexdump 等管道输出程序的输出)。

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

【讨论】:

  • 而且这个程序绝对不是C!
  • 这将如何工作?我是文件 I/O 的小伙伴,因为之前有人告诉我,终端接受的字符与文件不同。
  • 奇怪的@user4581301 还有,BoundaryImposition 怎么消除最后一个字符?
  • @TheScripterGeek Boundary Imposition 已经回答了这个问题:注意退格并在将前一个字符写入文件之前将其删除。一旦它在文件中,再次将其取出是比你想做的更多的工作。
  • 嗯,项目是我没有将所有字符都存储在数组或其他东西中,我只是已经将它输入到文本文档中。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    相关资源
    最近更新 更多