【问题标题】:How to parse a part a file in C++ on Linux如何在 Linux 上用 C++ 解析文件的一部分
【发布时间】:2011-12-26 15:05:11
【问题描述】:

我有一个名为 file.txt 的文件,它的结构如下:

owner_name    : first_last_name
filesize      : 1000
is_legal_file : yes
date          : someDate

.
.
.

我想获取 fileSize 中的值。 (本例中为 1000。)

我如何获得这些信息?

【问题讨论】:

  • 提示:使用ifstreamread

标签: c++ linux file-io


【解决方案1】:

逐行读取文件直到第二行,然后strtok()第二行:,你将有两个字符串:filesize1000,然后你可以使用atoi()

【讨论】:

  • 是否可以只阅读第二行? (因为它实际上是第 15 行.. 我想节省时间而不是逐行读取文件)
  • 我认为这不可能。
  • 不可能。您必须阅读文件才能找到行分隔符。如果它处于已知偏移量,您可以寻找该位置,但这似乎不是您的情况。无论如何,担心文件中的 15 行肯定是过早的优化。
【解决方案2】:

除了 strtok 之外,另一个简单的方法是执行 while (infile >> myString)。只需算出你想要的值的个数并取出即可。

std::string myString;
ifstream infile("yourFile.txt");
while (infile >> myString)
{
    //Do an if-statement to only select the value you want.
    //Leaving this for you since I think it's homework
}

【讨论】:

  • 谢谢。有没有办法通过使用 char* 而不是 string 来做到这一点?
【解决方案3】:

Split (partition) a line using sstream

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

int main() {
  using namespace std;
  for (string line; getline(cin, line); ) {
     istringstream ss(line);
     string name;
     ss >> name; // assume spaces between all elements in the line
     if (name == "filesize") {
        string sep;
        int filesize = -1;
        ss >> sep >> filesize;
        if (sep == ":" && ss) {
          cout << filesize << endl;
          break;
        }
     }
  }
}

输出

1000

相关:Split a string in C++?

【讨论】:

  • 谢谢。有没有办法通过使用 char* 而不是 string 来做到这一点?
  • @user1106106:如果你使用char*,那么strtok_r()更合适。
猜你喜欢
  • 1970-01-01
  • 2018-12-20
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
相关资源
最近更新 更多