C ++一旦到达行尾,就停止将文本输入到2D数组中

时间:2016-08-29 23:19:18

标签: c++ arrays text-files

我已经搜索并重新阅读,但我无法解决这个问题。我只是想将一个文本文件输入到[i] [j]字符串数组中。它做得很好,但我需要它一旦到达行的末尾就停止输入到数组中,并开始将第二行放在行的末尾的第二个数组中,依此类推......

我的文件包含4个单独的行。

这是第一行 这是第二行 这是第三行 这是第四行。

我的代码读取它并且主要做我需要的东西。但它会将所有内容放入数组中,直到它耗尽空间然后继续到下一行。一旦到达第一行结束,它就不会停止。这是我的代码。

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
    string arrayTextIn[25][25];
    ifstream textIn;
    textIn.open("sampleText.txt");

    for(int i=0; i<25; i++)
        for(int j=0; j<25; j++)
    {
        textIn >> arrayTextIn[i][j];
            if(arrayTextIn[i][j] == "\n") //This is where I dont know how to proceed.
                break;
    }

    for(int i=0; i<25; i++)
        for(int j=0; j<25; j++)
           cout << i << " " << j << " "<< arrayTextIn[i][j] << endl;

    return 0;
}

这是输出,但我想要的是每一行从新的第[i]行开始。谢谢你的帮助。
0 0这个
0 1是
0 2行
0 3一 0 4这个 0 5是
0 6线
0 7二。
0 8这个 0 9是
0 10线
0 11三 0 12这个 0 13是
0 14行
0 15四 0 16
1 0
1 1
1 2
1 3
1 4

2 个答案:

答案 0 :(得分:1)

这是一个两步过程。

第一步是读取输入,一次一行,这将读取输入文件中的每一行文本:

ifstream textIn;

textIn.open("sampleText.txt");

for(int i=0; i<25; i++)
{
    std::string line;

    if (std::getline(textIn, line).eof())
        break;

    // Magic goes here.

}

所以,到目前为止我们已经完成的是读取每行输入,最多25个。

第二步是获取每行输入,并将其划分为以空格分隔的单词。这部分是神奇的地方,上面是:

std::istringstream iline(line);

for(int j=0; j<25; j++)
{
    std::string word;

    if ((iline >> word).eof())
        break;

    arrayTextIn[i][j]=word;
}

首先构建istringstream,其工作方式与ifstream完全相同,但输入流来自字符串。

然后,它几乎就是你原来的,除了现在范围足够小,可以通过一个循环轻松处理。

总之:处理任何中等复杂度任务的方法是将其划分为两个或更多个较小的任务。在这里,您将这个相对复杂的任务转换为两个更小,更容易实现的任务:首先,读取每行文本,然后,给定一行读取文本,将每一行划分为单独的单词。

答案 1 :(得分:-1)

如果您真的想要维护您的设计(2D阵列),那么这可能是一个快速的解决方案:

for (int i = 0; i < 25; i++) {
  std::string line;
  std::getline(textIn, line);  // read the entire line

  if (textIn.eof()) {
    // if reach the end of file, then break the cycle.
    break;
  }

  if (line.size() > 0) {  // avoid empty lines
    int j = 0;
    size_t finder;

    // Cycle and looking for whitespace delimiters.
    while (finder = line.find(' '), finder != std::string::npos && j < 25) {
      // get a single word
      auto token = line.substr(0, finder);

      if (token != " ") {
        // if that word is not a simple white-space then save it in the array. You can also std::move if C++11
        arrayTextIn[i][j] = token;
        ++j;
      }

      // erase that part from the main line
      line.erase(0, finder + 1);
    }
  }
}