从文件读取输入并存储到2D阵列

时间:2014-04-25 18:36:58

标签: c++ file-io

我需要读取一个只包含整数的文本文件,每个文件由新行分隔。例如:

0
1
2
...
64
repeating 0 to 64 64 times

本质上,文件长64 * 64行,每行包含一个整数。

我需要将每个整数(行)存储在我的2D数组ldisk中,但是我遇到了严重的问题。我理解我的代码有错误,因为我试图将字符串存储在char中,但我不知道如何解决这个问题。顺便说一下, ldisk必须是一个二维的字符数组。我希望对我下面发布的当前代码或替代解决方案提供一些建议/反馈。 注意:我是C ++的初学者 PS: 我知道类似的主题存在,但我的更多的是绕过类型转换或只是正确转换它的问题所以我可以存储多于一个数字整数到我的2D数组,因为我有它工作的地方我只能存储在我的2D数组中我想要的第一个数字,但是如果有超过1个数字则会遇到问题。

 int main(){
      char **ldisk;
      ldisk = new char*[64];
      for (int i = 0; i<64; i++)
        {
          ldisk[i]= new char[64];
        }
      int counter = 0;
      string line;
      ifstream inFile("example2.txt");
      while ( getline(inFile, line))
        {
          int first, second;
          first = counter/64;
          second = counter%64;
          cout << line;
          ldisk[first][second]= line;
        }
      return 0;
    }

编辑: 道歉,我不知道如何做桌子。

I want ldisk[0][0] to be 0,
 then ldisk[0][1] to be 1,
 then ldisk[0][2] to be 2,
 etc,
 etc,
 then ldisk[0][63] to be 64

最终它会填满ldisk [63] [63] = 64

2 个答案:

答案 0 :(得分:2)

这是问题所在:

ldisk[first][second]= line;

ldisk[first][second]的类型为char。您正在尝试为其分配std::string

使用std::vector<std::string>可以让您的生活更轻松。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main(){

    vector<string> ldisk;

    int counter = 0;
    string line;
    ifstream inFile("example2.txt");
    while ( getline(inFile, line))
    {
       cout << line;
       ldisk.push_back(line);
    }
    return 0;
}

<强>更新

如果您必须char** ldisk,则可以将main更改为:

int main()
{
   char **ldisk;
   ldisk = new char*[64];
   for (int i = 0; i<64; i++)
   {
      ldisk[i]= new char[64];
   }
   int counter = 0;
   string line;
   ifstream inFile("example2.txt");
   while ( getline(inFile, line) && counter < 64 )
   {
      cout << line << endl;
      if ( line.size() >= 64 )
      {
         cout << "Line is longer than 63 characters. Copying only 63 characters from it.\n";
         strncpy(ldisk[counter], line.c_str(), 63);
         ldisk[counter][63] = '\0';
      }
      else
      {
         strcpy(ldisk[counter], line.c_str());
      }
      ++counter;
   }

   return 0;
}

答案 1 :(得分:0)

将您的循环更改为:

for (counter = 0; counter < 64*64; ++counter)
{
    int item;

    if ( !(inFile >> item) )
    {
         cerr << "File only contained " << counter << "items.\n";
         return 1;
    }

    if ( item < CHAR_MIN || item > CHAR_MAX )
    {
         cerr << "Item " << counter << " invalid value " << item << "\n";
         return 2;
    }

    ldisk[counter/64][counter%64] = item;
}

缺少的成分是您没有尝试将文件中的字符串转换为整数值。您可能需要#include <climits>