Входные и выходные текстовые файлы

Я делаю простое задание и у меня возникают проблемы с выводом намеченного результата. Может ли кто-нибудь помочь мне понять, в чем проблема? Нам не разрешено использовать 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

Вывод, который я продолжаю получать, хотя первые две строки вывода верны, но затем третья строка не возвращается и не считывает идентификационный номер 2-й строки, но сохраняет 11111 в качестве идентификационного номера, в то время как значение vehType равно 2, а табличка - 0390 Я так запутался с этим, так как я довольно новичок в C++.

заранее спасибо

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 A VID392 237237 A DKS382 237237 A DKF329 237237 M AJD302 237237

Который, кажется, делает правильную вещь. Это оставляет больше вопросов, чем ответов, но:

1) Обратите внимание, что когда вы вызываете peek(), он возвращает int, а не char, поскольку результатом может быть EOF. Вы не показываете объявления ни одной из ваших переменных, но это может быть небольшой проблемой.

2) Вы не проверяете исчерпание ввода сразу после строки "update >> vehType ...". Вы действительно должны это сделать, поскольку поток не будет сообщать о EOF, пока вы не запросите данные, которые он не может предоставить. Когда код стоит, похоже, он может использовать устаревшие данные в последний раз в цикле.

3) Вы говорите, что vehType сообщается как 2, в то время как табличка 0390; это, вероятно, означает, что он интерпретировал "20390" как комбинацию одного символа vehType, а остальные - как строку. Я не понимаю, как это могло произойти (а я этого не сделал), но я предполагаю, что у вас есть скрытый мусорный символ на входе, который отбрасывает вещи. (Возможно, неразрывный пробел в юникоде или что-то такое?) Было бы очень полезно добавить строку отладки, в которой вы распечатываете все значения vehType / plate / year / vehPrice, которые он читает, прямо во время их чтения, чтобы Посмотрите, где код идет не так.

Другие вопросы по тегам