4

这个问题困扰了我一个晚上。谢谢!

此代码将两次写入文件中的最后一行。为什么?

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
const int strSize = 1000;
int main(int argc,char *argv[])
{
    ifstream infile(argv[1]);
    if(!infile)    cerr<<"infile error!"<<endl;
    ofstream outfile(argv[2]);

    int sequenceNum = 1;
    char str[strSize];
    while(infile){
        infile.getline(str,strSize);
        if(sequenceNum>469)
            str[0] = '2';
        else if(sequenceNum>67)
            str[0] = '4';
        else if(sequenceNum>1)
            str[0] = '1';
        else
            str[0] = '3';
        outfile<<str<<endl;
        ++sequenceNum;
    }
    return 0;
}

在is之后infile.getline(str,strSize);,如果 str 没有被修改,为什么是 null?但之后,成为最后一行。strNULLif(sequenceNum>469)str

这段代码只写最后一行一次。

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
const int strSize = 1000;
int main(int argc,char *argv[])
{
    ifstream infile(argv[1]);
    if(!infile)    cerr<<"infile error!"<<endl;
    ofstream outfile(argv[2]);

    int sequenceNum = 1;
    char str[strSize];
    while(infile){
        infile.getline(str,strSize);
        if(strlen(str) != 0){//The key is this sentence.
            if(sequenceNum>469)
                str[0] = '2';
            else if(sequenceNum>67)
                str[0] = '4';
            else if(sequenceNum>1)
                str[0] = '1';
            else
                str[0] = '3';
            outfile<<str<<endl;
            ++sequenceNum;
        }
    }
    return 0;
}
4

4 回答 4

10

问题是当infile.getline读取最后一行时(即读取到 EOF),while(infile)仍然会评估为真,导致循环再次运行。但是,既然infile已经读取了整个文件,infile.getline就会失败,并且str会变成一个空字符串。但是,由于您的原始代码覆盖了第一个字符,它摆脱了空终止符,因此它最终重用了上次的内容。

相反,你想要这样的东西:

while (infile.getline(str, strSize)) {
    if (sequenceNum>469)
    ...
}
于 2013-07-31T13:28:07.443 回答
2

麻烦的是,在你读完最后一行之后,infile仍然评估为true. 只有在您尝试(并且失败)读取另一行之后,它才会评估为假;您的for循环进入测试读取打印,因此它无法读取并str在退出之前打印旧内容。

试试这个:

while(infile.getline(str,strSize))
  ...
于 2013-07-31T13:28:57.727 回答
0

是的,它有帮助

while(infile.getline(str,strSize)) ...

于 2017-03-20T06:35:57.477 回答
-1

从我看到的描述来看,它看起来像是在到达行终止符之前到达文件末尾时,eofbit被设置了。在这种情况下并没有说明输出字符串的状态是什么,因此一种可能的实现是它可能不会被修改。

因此,在这种情况下,如果您不检查 eof 并仅打印字符串,它可能仍具有上次调用后的内容。

您对流进行的检查不是“我在文件末尾吗?”,而是“流是否仍处于有效状态?” 只有当它到达 EOF 然后你尝试再次读取它时它才会失效。

所以你可以通过检查来避免双线infile.eof()。不幸的是,您仍然会丢失最后一行的内容。据我所知,解决该问题的唯一方法是坚持没有人在最后一行放置任何重要字符,或者不getline()用于您的输入阅读。

于 2013-07-31T13:29:33.393 回答