以特定方式读取文本文件

时间:2014-08-03 00:00:35

标签: c++ parsing iostream getline string-parsing

我们假设我有以下输入

8 2 I slept long 
8 3 5 Students didn't do well
9 1 What should I do? seriously
9 5 I have no idea what to do from now on

存储在wow.txt中。

我想为每一行分别取两个整数和字符串 (所以对于第一行,我接受8,2,然后我睡了很长的字符串作为输入 然后移到下一行,对于第二行,我将8和3作为整数 5学生没有做好弦乐等等,但我不知道该怎么做。

如果我使用getline,那么我会将整行作为输入,我很想知道 如果有一种方法可以获取前几个输入和其余的输入线 分开。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

这是一个简单的解析练习。主要是,您需要了解如何在C ++中使用输入流。

  int a, b;

  std::string line = "8 2 5 Students didn't do too well";

  std::istringstream iss(line);//initialize to the contents of the string.

  iss >> a >> b;

  std::string str;
  std::getline(iss, str);

由于默认情况下输入流会跳过空格,因此您可以利用此功能。简单地说:

  1. 使用string stream将前两个输入作为整数读取。
  2. 使用std::getline从字符串流中存储字符串的其余部分(在std::getline中的分隔字符是新行)。
  3. 而且就是这样。

    因此,abstr的内容将分别为:

    8
    2
     5 Students didn't do too well
    

    毫无疑问,您唯一需要注意的是,存储的字符串(str)的第一个字符将是一个空格。但是,您可以自行删除它。

答案 1 :(得分:1)

为了得到一个完整的例子,你可以这样做:

// Open a file for input
ifstream f("wow.txt");

// Repeat until you reach the end of the file
while (!f.eof()) {
    int i, j;

    // Read the integers using stream operators
    f >> i >> j;

    // If there are no more integers (e.g. an empty line or
    // invalid integers at the beginning), end the loop
    if (!f.good())
        break;

    string s;

    // Read the rest of the line into a string
    getline(f, s);

    // Remove the space char at the beginning of the string 
    // (if present)
    if (s.length() > 1) {
        s = s.substr(1);
    }

    // Output result, separated by semicolons.
    cout << i << ";" << j << ";" << s << endl;
}

您可能已经注意到,在您需要决定的案例中,如何处理意外的输入。在这里,如果行的开头没有两个整数,我只是退出循环。另一方面,我在整数后忽略了一个缺少的字符串,并在这里接受空字符串。

您希望如何执行此操作取决于您输入数据的可靠程度以及您使用该功能的情况。

编辑 jrd1与我有着相同的想法,发布它的速度比较慢。我仍然在这里留下我的答案,因为它使用fstream添加并显示了一种处理解析错误的简单方法。

答案 2 :(得分:0)

由于文件是文本,因此它将是一系列将被读入的行。您需要以您正在使用的任何语言自行拆分(使用空格字符)。 在二进制模式中,它是相同的东西,没有&#34;读取直到找到空格&#34;

除非你逐字逐句地寻找空格,否则效率低下。