2014-01-13 2 views
0

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

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

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

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

+0

[Работает для меня] (http://ideone.com/HzJoPi) –

ответ

0

Ну, я взял свой код и изменить его немного, так что я мог запустить его:

#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 DKS382 2011 20390 33333 DKF329 2001 30920 М 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, которые он читает, прямо сейчас, когда они читаются, см., где код идет не так.

+0

Я смотрю на него, и, похоже, он не читает последние upData >> houseIdent ;. Кажется, что ввод пропускается, и мне интересно, почему его пропускают. – user2649644

Смежные вопросы