C ++一行一行地读取文本文件

时间:2015-02-17 22:08:55

标签: c++ ifstream

我有一个包含16,900,000行的文件,每行包含10个数字(int和float的混合)。我试图逐行读取此文件,稍微修改每一行,并写入一系列新文件。下面的代码适用于运行Windows Visa的笔记本电脑,但是当我在运行Windows 7的桌面上运行它时,输出文件不包含输入文件中的所有数据。输出文件中的行数从2500到40,000不等。

我已经注释掉所有处理和写入文件,并且每隔100行写入cout,最后一行要打印不是文件的最后一行。

// skipping code prior to the loop
// only including minimal code that reproduces the problem
ifstream infile((srcdir+filename).c_str()); 
string line;
int lcount=0;

while(getline(infile,line)){
    if(line.find("#")==string::npos){
        lcount++;
        if(lcount%100==0){
            printf("Generating tiles for %s: %d lines processed\n",filename.c_str(),lcount);
        }

    }
}

问题:

  1. 是否存在可能溢出的最大缓冲区大小?

  2. 有人能看到我的代码有问题吗?

  3. 有什么理由可以在Windows Vista上正常工作,但在Windows 7上没有?

2 个答案:

答案 0 :(得分:0)

在你的问题中,信息很少。但我会在这里猜测:

我不认为lcount在代码中的正确位置递增。只有'#'不在line时才会增加(我猜这是某种评论)。但是必须计算一行(含有)'#'。所以你的代码应该是:

while(getline(infile,line)){
    lcount++;  // Increment every time.
    if(line.find("#")==string::npos){
        if(lcount%100==0){
            printf("Generating tiles for %s: %d lines processed\n",filename.c_str(),lcount);
        }

    }
}

另一方面,您应该激活isftream异常以查看最新情况,请参阅here如何操作。

答案 1 :(得分:0)

在尝试创建可以重现问题的最小完整程序时,我找到了罪魁祸首。

我正在尝试使用我公司正在使用的密钥加密狗来保护可执行文件。当我删除加密狗的检查时,读取了整个文件。