【问题标题】:Ifstream and Ofstream problemsIfstream 和 Ofstream 问题
【发布时间】:2014-09-24 09:45:45
【问题描述】:

您好,我在理解 Ifstream 和 Ofstream 时遇到了一些问题。我正在尝试从名为“thefile.txt”的预制文件中导入文本,该文件包含:

Google (GOOG)
522.01 2 100
520.66 1.5 80
Apple (AAPL)
389.27 2 150
401.82 1.8 150
Microsoft (MSFT)
25.06 2.5 100
25.07 2 80

这里是代码块:

fin.open(inputfile);
fin >> stockname1 >> buyingcost1 >> commission1 >> shares1 >> sellingcost1 >> sellingcomish1 >> sharessold1
    >> stockname2 >> buyingcost2 >> commission2 >> shares2 >> sellingcost2 >> sellingcomish2 >> sharessold2
    >> stockname3 >> buyingcost3 >> commission3 >> shares3 >> sellingcost3 >> sellingcomish3 >> sharessold3;
fin.close();

所有内容都正确声明,我已经“#”包含了所有需要包含的内容,但是当我尝试访问变量时,它们仍然是空的。

【问题讨论】:

  • 我们需要更多信息。请添加变量声明。你也没有检查fin 是否仍然是good()(或者曾经在open() 之后)。
  • 很可能是您的工作目录中不存在该文件。第一步是验证文件是否已成功打开。将您的输入包装在 if (fin) 条件中,在 else 分支中打印错误消息。
  • 好吧,把整个程序扔到代码部分可以吗?
  • 目前stockname1 将读取Googlebuyingcost1 将尝试读取(GOOG),因为>> 一次只能读取一个单词。
  • @HalpMehPlz 不,把你的整个程序放在这里是不行的。您应该显示一个minimal version,它会重现相同的行为。

标签: c++ iostream


【解决方案1】:

对于字符串,operator >> 逐字读取。对于stockname,您必须使用std::getline

(我假设输入文件打开成功)

所以你这样做:

std::getline(fin, stockname1);
fin >> buyingcost1 >> commission1 >> shares1 >> sellingcost1 >> sellingcomish1 >> sharessold1;
// skip until EOL so next getline() reads the right thing
fin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Demo

【讨论】:

  • 如何在我的列表中使用它?会是 std::getline(fin,stockname1);
  • 仍然没有打印任何东西,程序正在进入 if(fin)
【解决方案2】:

我认为你的程序无法打开文件。根据你的代码,我猜stockname1是一个字符串。如果文件打开成功,stockname1应该有东西。要检查问题,第一步是添加if(fin) 有条件并在分支中输出一些东西以进行调试。 Anton Savin 提到的错误也存在。

【讨论】:

    【解决方案3】:

    我推测问题可能是“fin.open(inputfile);”
    也许“fin.open(inputfile, ios::in);”可以吗?
    (对于输入,如果您还需要输出,请使用“, ios::in | ios::out”,下面链接中的正确信息)


    另一个问题可能是(例如)“Google (GOOG)”,因为据我所知,>> 输入解释空格的方式与换行的方式相同。 正如其他人提到的,“getline.()”读取一整行(据我所知,虽然是一个字符串)

    我个人发现this 在学习基本的 c++ 文件处理时很有帮助。

    【讨论】: