C++逐行读取文本文件中途停止

C++ reading text file line by line stops partway through

我有一个包含 16,900,000 行的文件,每行包含 10 个数字(整数和浮点数的混合)。我试着逐行读取这个文件,稍微修改每一行,然后写入一系列新文件。下面的代码适用于笔记本电脑 运行ning Windows Visa,但是当我 运行 它适用于台式机 运行ning 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 上却不行?

你的问题信息量很少。但我会把我的猜测放在这里:

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

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 如何操作。

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

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