因此,我和我的同事们突然间有一些离合器。我被分配了一个导入函数来读取看起来像这样的文本文件,并将其存储到2D数组:
列以制表符分隔。当这突然出现时,没有整个项目文件与我,我远远不及我旧的可靠性,我尝试以最通用的方式召唤这个:
void signal::import_data(string filename){
ifstream file;
file.open(filename.c_str());
if(file.fail()){
cerr << "file open fail" << endl;
}else{
while(!file.eof)
{
for(int j = 0; j < NumCols; j++){
for(int i = 0; i < NumRows; i++){
file >> _data[j][i];
}
}
}
}
file.close();
}
我这样做是对的吗?我不太确定像这样的流媒体可以绕过标签,还是可以?
答案 0 :(得分:3)
我认为这段代码:
while(!file.eof)
{
for(int j = 0; j < NumCols; j++){
for(int i = 0; i < NumRows; i++){
file >> _data[j][i];
}
}
}
应该替换为:
for(int j = 0; j < NumCols; j++)
{
for(int i = 0; i < NumRows; i++)
{
if ( !(file >> _data[j][i]) )
{
std::cerr << "error while reading file";
break;
}
}
if ( !file ) break;
}
也就是说,如果您希望文件中有NumCols * NumRows
个条目,为什么要显式检查文件结尾?让它读,直到你读到NumCols * NumRows
条目被读取。一旦读取,它将自动退出循环。
但是你必须在 NumCols * NumRows
条目被读取之前检查文件是否以结束,这就是我这样做的原因:
if ( !(file >> _data[j][i]) )
{
std::cerr << "error while reading file";
break;
}
如果文件在完成读取NumCols * NumRows
条目之前达到 eof 字符或其他一些读取失败,那么if
中的条件将评估为{{1并且它将打印错误消息并打破循环,它也会破坏外部循环,因为表达式true
将评估为!file
。
有关如何使用C ++流读取文件的详细说明,请阅读以下主题的答案: