【问题标题】:Input and Output text files输入和输出文本文件
【发布时间】:2014-01-13 18:09:17
【问题描述】:

我正在做一个简单的作业,但无法输出预期的输出。有人可以帮助我找出问题所在的方向吗?我们不允许使用 istringstream。

    else
    {
       upData >> houseIdent;

       while(upData)
       {

         do{
                upData >> vehType >> plate >> year >> vehPrice;

                calculate = calcReg(vehType, plate, year,
                                vehPrice);

                outDataOne << fixed << showpoint << setprecision(2);
                outDataOne << ' ' << vehType << ' ' << plate << ' ' << calculate
                           << endl;


                ch = upData.peek();

          }while (upData && (ch != '\n'));  

          upData >> houseIdent;

    }

upData 是 ifstream .txt,outDataOne 是 ofstream .txt。输入类似这样

11111 M DKC294 2007 23001 A VID392 2010 10390
22222 A DKS382 2011 20390
33333 A DKF329 2001 30920 M AJD302 2004 15509

虽然我一直得到的输出是前两个输出行是正确的,但是第三行没有返回并读取第二行 ID 号,而是将 11111 作为 ID 号,同时将 vehType 设置为 2 和板为 0390。我对此感到很困惑,因为我对 C++ 还很陌生。

提前致谢

【问题讨论】:

标签: c++ loops visual-c++ fstream nested-loops


【解决方案1】:

好吧,我拿走了你的代码并稍微修改了一下,以便我可以运行它:

#include <iostream>
#include <iomanip>
#include <string>

int main(int argc, char *argv[]) {
  #define upData std::cin
  #define outDataOne std::cout

  string houseIdent;
  char vehType;
  string plate;
  int year;
  int vehPrice;
  int ch;
  upData >> houseIdent;
  while (upData) {
    do {
      upData >> vehType >> plate >> year >> vehPrice;

      auto calculate = 237237; // calcReg(vehType, plate, year, vehPrice);

      outDataOne << std::fixed << std::showpoint << std::setprecision(2);
      outDataOne << ' ' << vehType << ' ' << plate << ' ' << calculate << endl;

      ch = upData.peek();

    } while (upData && (ch != '\n'));

    upData >> houseIdent;
  }
  return 0;
}

然后输入你的输入:

11111 M DKC294 2007 23001 A VID392 2010 10390 22222 A DKS382 2011 20390 33333 A DKF329 2001 30920 M AJD302 2004 15509

然后它吐了出来:

M DKC294 237237 一个VID392 237237 DKS382 237237 DKF329 237237 M AJD302 237237

这似乎是在做正确的事。这似乎留下的问题多于答案,但是:

1) 请注意,当您调用 peek() 时,它返回一个 int,而不是 char,因为结果可能是 EOF。您没有显示任何变量的声明,但这可能是一个小问题。

2) 您没有在“update >> vehType ...”行之后检查输入是否用完。你真的需要这样做,因为在你向它询问它无法提供的数据之前,流不会报告 EOF。就代码而言,它看起来可能在最后一次循环中使用了陈旧的数据。

3)你说vehType报告为2,而车牌是0390;这可能意味着它将“20390”解释为 vehType 的一个字符和其余字符的组合。我不知道这是怎么发生的(当我尝试它时它没有发生),但我的猜测是你的输入中有一个隐藏的垃圾字符,它正在抛出一些东西。 (也许是一个 unicode 不间断空格或类似的?)添加一个调试行将非常有帮助,您可以在其中打印出它读取的所有 vehType / plate / year / vehPrice 值,就在它们被读入时,看看代码哪里出错了。

【讨论】:

  • 我正在查看它,它似乎没有读取最后一个 upData >> houseIdent;。似乎输入被跳过了,我想知道为什么它被跳过了。
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多