2

所以我和我的队友突然手头有一些离合器。我被分配了一个导入函数,该函数读取一个看起来像这样的文本文件,并将其存储到一个二维数组中: 在此处输入图像描述

列是制表符分隔的。当这突然出现时,我没有整个项目文件,而且我离我的旧可信赖者还很远,我尝试以最通用的方式将其变出:

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();
}

我这样做对吗?我不太确定这样的流媒体是否可以绕过标签,或者可以吗?

4

1 回答 1

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;
}

如果文件在完成读取条目之前达到eof字符或其他一些读取失败,则条件将评估为,它将打印错误消息并中断循环,它也会中断外循环,因为表达式将评估为。NumCols * NumRowsiftrue!filetrue

有关如何使用 C++ 流读取文件的详细说明,请阅读以下主题的答案:

于 2013-01-26T16:58:33.767 回答