C ++:读取.txt内容并存储到2D数组中

时间:2013-01-26 16:54:14

标签: c++ arrays matrix filestream

因此,我和我的同事们突然间有一些离合器。我被分配了一个导入函数来读取看起来像这样的文本文件,并将其存储到2D数组: enter image description here

列以制表符分隔。当这突然出现时,没有整个项目文件与我,我远远不及我旧的可靠性,我尝试以最通用的方式召唤这个:

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

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

1 个答案:

答案 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 ++流读取文件的详细说明,请阅读以下主题的答案: