【问题标题】:C++: Read .txt contents and store into 2D arrayC++:读取 .txt 内容并存储到二维数组中
【发布时间】:2013-01-26 16:54:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • 避免这种情况:while(!file.eof),读作if ( !(file &gt;&gt; _data[j][i])) break;
  • 明白!但是其余的代码还好吗?还有,说实话?我真的不知道为什么 while(!file.eof) 是一个可行的选择,只是想知道你能不能告诉我为什么
  • @Erasmus:我相信你应该避免while (!file.eof()),因为如果在执行file &gt;&gt; ... 时从输入流中读取的令牌无法解析为整数,那么输入迭代器将不会前进。如果是这种情况,您可能永远不会到达文件末尾。

标签: c++ arrays matrix filestream


【解决方案1】:

我认为这段代码:

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 中的条件将评估为true 并将打印错误消息并中断循环,它也会中断外循环,因为表达式!file 将评估为true

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多