【问题标题】:Parsing File I/O解析文件 I/O
【发布时间】:2013-02-15 23:11:15
【问题描述】:

我编写了一个 C++ 程序,该程序需要能够从 .txt 文件中读取,并解析输入以便能够从每一行获取命令和参数。

假设我有 Animals.txt

A cat1 3
A dog1 4
A cat2 1
D cat1

我希望能够拿到这个文件,然后为第一个字母创建一组if语句,这样我就可以在主类中调用一个与第一个字母对应的函数,并将其余的传递给作为参数输入。

我正在尝试做的一个例子:

if(line[0].compare("A")==0){
    add(line[1],line[2]);
}
if(line[0].compare("D")==0){
    delete(line[1])
}

我尝试使用 strtok 和 stringstream 类,但要么我不知道如何实现我的需要,要么它们不能满足我的需要,因为值被放入 line[0] 而不是文本文件行的开头。 任何帮助将不胜感激。

【问题讨论】:

  • 嗯,你不知道如何使用它们来满足你的需要。您不会实现它们;他们已经在那里了。
  • 听起来像是作业问题?我认为您需要发布更多您已经编码和运行的内容以获得任何有用的反馈。
  • 另外,你不能命名一个函数delete;这是一个关键字。

标签: c++ file-io io


【解决方案1】:

首先你需要std::ifstream 来打开文件。然后你需要std::getline 从文件中提取行:

std::ifstream file("Animals.txt");
std::string line;
while (std::getline(file, line)) {
  // ...
}

然后在 while 循环中,将行插入 std::stringstream 并提取您需要的值:

std::stringstream ss(line);
char letter;
ss >> letter;
// And so on...

对于char,您可以在if 语句中进行简单的== 比较:

if (letter == 'A') {
  // ...
}

如果您将字母提取到std::string,只需确保与"A" 进行比较。

我会让你把所有的东西放在一起,然后弄清楚剩下的。

【讨论】:

  • 这真的很有帮助,但是我已经实现了类似的东西,并且由于行可以有不同数量的参数,具体取决于第一个字符,所以我一直遇到问题。我是否通过将字符串流嵌套在 if 语句中来解决这个问题?任何指针都会有所帮助。
  • @user2073188 在if 语句之外有std::stringstream 并读取第一个字符。然后,在您的if 语句中,根据需要从std::stringsteam 中提取更多内容。例如,如果您得到A,则执行ss >> some_string >> some_int;。如果你得到D,就做ss >> some_string;
  • stringstream 在这种情况下似乎有点矫枉过正,他似乎不需要知道换行符在哪里
  • @MooingDuck 当然,他们可以没有它。我喜欢这样做,因为它将从文件中提取一行和解析该行分开。当然,如果不保证有换行符,我就不会这样了。
【解决方案2】:

创建一个istringstream对象来分割每一行:

std::istringstream line(my_line);
std::string line0;
std::string line1;
std::string line2;

line >> token;
if (line0 == "A") {
    line >> line1 >> line2;
    add(line1, line2);
} else if (line0 == "D") {
    line >> line1;
    remove(line1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 2010-12-25
    • 2013-09-22
    • 2015-11-13
    • 2016-02-09
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多