【问题标题】:Reading a text file in a particular way以特定方式读取文本文件
【发布时间】:2014-09-25 20:23:06
【问题描述】:

假设我有以下输入

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,那么我会将整行作为输入,我想知道 如果有办法获取前几个输入和该行的其余部分 分开。

任何帮助将不胜感激。

【问题讨论】:

  • 您正在学习 C++ 课程吗?你查阅过你的文字吗?
  • 尝试更简单的;如果第一个整数 (8) 是您想要的全部内容怎么办?你会怎么做?
  • 这不是给班级的。我只是想看看如何从 C++ 中提取数据。

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


【解决方案1】:

这是一个简单的解析练习。主要是,您必须在 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 中的定界字符是换行符)。

然后,就是这样。

因此,abstr 的内容分别为:

8
2
 5 Students didn't do too well

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

【讨论】:

  • 这是一种避免自己进行解析的有趣方式,但通常您想要做的事情是错误检查或处理案例,因此自己拆分和解析是我的选择。但我对正确性和新颖性给出了 +1。
  • @SingleStepper:感谢您的评论。我同意你所说的。但是,要正确解决您已经非常正确地陈述的此类问题,这将需要很长时间的解释。另外,由于之前已经这样做过,最好使用一些开源库来更好、更可靠地解决这些问题。
【解决方案2】:

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

// 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 添加并显示了一种处理解析错误的简单方法。

【讨论】:

    【解决方案3】:

    由于文件是文本,因此它是一系列将被读取的行。您需要使用您使用的任何语言自行拆分(使用空格字符)。 在二进制模式下也是一样的,没有“读取直到找到空格”这样的东西

    除非您逐个字符地阅读以查找空格,否则效率低下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多