【问题标题】:C++ file writing - not writing variables as expectedC++ 文件写入 - 未按预期写入变量
【发布时间】:2014-05-20 17:55:33
【问题描述】:

我浏览了一些不同的东西(似乎无法在复数视觉上找到一个好的文件 i/o 教程),并且我已经阅读了关于文件写入的 tutorialspoint 和 cplusplus 网站,但我的似乎工作不一样.

我复制了相当相似的教程,来自关于 C++ 文件 I/O 的教程点:

ofstream out;
out.open("D:\\cpp_files\\test_iofile.txt", ios::out);

cout << "Writing to file" << endl;
cout << "Enter your name: ";
string name;
getline(cin, name);

out << name;

cout << "Enter age: ";
int age;
cin >> age;

out << age << endl << "This is an insert" << endl;
out.close();

中间还有一些你可能不太关心的东西,然后是这个部分:

out.open("D:\\cpp_files\\test_iofile.txt", ios::ate);
out << endl;

string inp;
cout << "Write some random crap: ";
getline(cin, inp);

out << inp << endl;
out << "-----------";
out.close();

奇怪的是,它在正确的位置创建了 .txt 文件,但它的输出等于 2 个空白行和破折号。所以我最终得到(添加的“>”表示空行):

>
>
----------

我知道它一定是我错过的东西,但我似乎无法抓住它。编译器也没有构建错误。

【问题讨论】:

    标签: c++ file-io


    【解决方案1】:

    cin &gt;&gt; age; 之后,您必须刷新缓冲区,

    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
    

    并将ios::ate 更改为ios::app

    必须#include &lt;limits&gt;

    ios:ate 截断文件,而ios::app 在末尾追加。

    cin.ignore 的替代方法是在 cin &gt;&gt; age 之后使用 getline 作为

    getline(cin >> ws, inp);
    

    这指示输入流丢弃以前累积的“空白”,即换行符、制表符等

    【讨论】:

    • 我认为 ios::trunc 被截断了。吃了只是把文件指针放在最后(如追加)但允许你移动?还有什么是 的?而且我不确定我是否理解 cin.ignore() 部分-本教程中没有。我得查一下
    • &lt;limits&gt; 用于常量std::numeric_limits&lt;std::streamsize&gt;::max()ate 实际上截断文件,请参阅stackoverflow.com/questions/12929378/…,而cin.ignore 部分是因为在您阅读年龄后,您会得到一个额外的将被下一个getline 吃掉的换行符,所以在随后的getline 中你最终得到一个空字符串。忽略部分只是告诉流刷新其内容stackoverflow.com/questions/10553597/…
    • 谢谢,这有帮助。主要问题是吃了(在阅读了您链接的文章后,我仍然试图弄清楚为什么它只是被截断了),而且似乎很可能不得不进入文件搜索并自己做应用程序之类的事情避免其他问题。就 cin >> ws 部分而言 - 这很有效。但我不是 100% 理解这个概念。我也会读起来,但你是在说 endl 吗?我添加的实际代码被读取为下一个输入,所以它永远不会向我询问 getline?和 >> 刷新它,但仍然写它?嗯
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多