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);
}
}
}
问题:
是否存在我可能会溢出的最大缓冲区大小?
有人能看出我的代码有问题吗?
为什么这在 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 如何操作。
在尝试创建一个可以重现问题的最小完整程序时,我找到了罪魁祸首。
我正在尝试使用我公司正在使用的密钥锁加密狗来保护可执行文件。当我取消对加密狗的检查时,整个文件都被读取了。
我有一个包含 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);
}
}
}
问题:
是否存在我可能会溢出的最大缓冲区大小?
有人能看出我的代码有问题吗?
为什么这在 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 如何操作。
在尝试创建一个可以重现问题的最小完整程序时,我找到了罪魁祸首。
我正在尝试使用我公司正在使用的密钥锁加密狗来保护可执行文件。当我取消对加密狗的检查时,整个文件都被读取了。