如何以这种特定方式从文件中读取和处理文本?

时间:2016-01-06 19:13:00

标签: c++ file input getline

我有一些关于处理我正在阅读的文件中的某些名称或数字的代码的问题。所以文件中的文字如下所示:

Imp;1;down;67
Comp;3;up;4
Imp;42;right;87

正如您所看到的,有3行,其中的单词和数字由字符';'分隔。 。我想一次读取每一行,并将整行中的一行分成单词和数字,然后处理信息(将用于创建带有数据的新对象)。然后转到下一行,依此类推,直到EOF。

所以,我想阅读第一行文本,将其拆分为由行中的单词和数字组成的字符串数组,然后从中创建一个类的对象。例如,对于第一行,创建类Imp的对象,如此Imp objImp(Imp, 1, down, 67)

在Java中,我使用information = line.split(";")'(其中line是一行文本)做了同样的事情,然后使用information[0]information[1]来访问字符串数组的成员并创建宾语。我试图在这里做同样的事情

2 个答案:

答案 0 :(得分:3)

不要将char数组用于缓冲区,don't use std::istream::eof。有人说过,让我们继续解决问题。

std::getlinestd::istream::getline相似,只是它使用std::string代替char数组。

在两者中,参数delim表示分隔字符,但在某种程度上它是字符,当遇到时,std::getline停止读取(不保存并丢弃它)。它并不意味着一种分隔符,它会在整条线上的每个;之间神奇地将输入分开。

因此,你必须这样做:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

...

std::ifstream myFile("D:\\stuff.txt"); // one statement

if (myFile.is_open()) {
    std::string line;

    while (std::getline(myFile, line)) { // line by line reading
        std::istringstream line_stream(line);
        std::string output;

        while (std::getline(line_stream, output, ';')) // line parsing
            std::cout << output << std::endl;
    }
}

我们从std::istringstream构建line,因此我们可以使用std::getline再次解析它。

答案 1 :(得分:1)

另一种(略有不同)替代方案:

/*
 * Sample output:
 *   line:Imp;1;down;67
 *     "Imp", "1", "down", "67"
 *   line:Comp;3;up;4
 *     "Comp", "3", "up", "4"
 *   line:Imp;42;right;87
 *     "Imp", "42", "right", "87"
 *   line:Imp;42;right;87
 *     "Imp", "42", "right", "87"
 */
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

void split(const std::string &s, char delim, std::vector<string> &fields)
{
    fields.clear();
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        fields.push_back(item);
    }
}

void print (std::vector<string> &fields)
{
  cout << "  ";
  for (size_t i = 0; i < fields.size() - 1; i++)
    cout << "\"" << fields[i] << "\", ";
  cout << "\"" << fields[fields.size()-1] << "\"" << endl;
}

int main ()
{
  std::ifstream fp("tmp.txt");
  std::string line;
  while (!fp.eof()) {
    fp >> line;
    cout << "line:" << line << endl;
    std::vector<std::string> fields;
    split(line, ';', fields);
    print(fields);
  }
  fp.close();
  return 0;
}