2015-11-29 3 views
0

Итак, у меня возникли проблемы с получением последнего элемента в текстовом файле для чтения в строковый объект.Проблемы с чтением элементов из файла (C++)

Я создал класс под названием «Автомобиль», и у меня должны быть все параметры для объекта «Car», считанного из файла, но он не будет регистрировать последний.

объекта

ifstream является "данные"

Переменные:

string carType; 
string reportingMark; 
int carNumber; 
string kind; 
bool loaded; 
string destination; 

Строка в текстовом файле гласит:

автомобиля CN 819481 обслуживания ложного NONE

Это то, что я имею прямо сейчас:

getline(data, ignore); // ignores the header line 
data >> carType >> reportingMark >> carNumber >> kind >> loaded; 
while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here) 
    data.get(); 
getline(data, destination); 

Таким образом, он будет читать все, кроме части «назначения».

+1

Я думаю, нам нужно увидеть немного больше контекста, как в вашем коде, так и в файле примера. – usr2564301

+0

Как насчет предоставления цикла while вашему объекту «ifstream» – AVI

+0

Расскажите подробнее о переменной «destination». Что он выводит в конце? Не хватает ли писем? Он пуст? Вызывает ошибки? Странные символы? – VillasV

ответ

0

Проблема эта часть:

data >> carType >> reportingMark >> carNumber >> kind >> loaded;

Здесь вы пытаетесь тростникового а Логическая переменная loaded из потока. Вы хотите, чтобы чтение false работало, но это не так. Он принимает только 0 или 1.

Вместо этого, не считывая логическую переменную, будет переключаться бит err потока, что делает чтение всего остального после сбоя.

Чтобы проверить, если вы делаете data.peek() сразу после этой строки, вы получите сообщение -1, что указывает на допустимый ввод.

Чтобы исправить это вам нужно будет либо изменить вам способ хранения информации для хранения 0/1 вместо true/false, или еще лучше:

Do: data << boolalpha перед чтением данных. Это позволит интерпретировать поток true/false как 0/1.

+0

О, я даже не заметил, что с булевой переменной! – Chuck

+0

Я не могу в это поверить, это то, что держало это все время! Спасибо, парень! – Chuck

0

Код верный; за исключением того, что я не вижу необходимости поставить

While (data.peek() == ' «) data.get();

getline (данные, адресат);

часть для чтения пункта назначения. Вместо этого вы можете просто прочитать его как пункт назначения данных >>. Кроме того, убедитесь, что ваш входной файл открывается правильно, поставив галочку

если (data.isOpen()) {// соиЬ что-то}

Я надеюсь, что это помогает! :)

+0

Если 'destination' может быть более одного слова (разделенного пробелами), этого будет недостаточно. – VillasV

+0

@VillasV звучит законно! –

0

Всегда полезно проверить возвращаемое значение всех операций ввода-вывода. Если вы добавите проверки ошибок, вы сможете найти проблему и найти решение для нее.

if (!getline(data, ignore)) // ignores the header line 
{ 
    std::cerr << "Unable to read the header\n"; 
    exit(EXIT_FAILURE); 
} 

if (!(data >> carType >> reportingMark >> carNumber >> kind >> loaded)) 
{ 
    std::cerr << "Unable to read the data\n"; 
    exit(EXIT_FAILURE); 
} 

while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here) 
    data.get(); 

if (!getline(data, destination)) 
{ 
    std::cerr << "Unable to read the rest of the line\n"; 
    exit(EXIT_FAILURE); 
} 
0

как о давая время цикла к вашей "ifstream" объект, как этот

ifstream ifstreamObject; 
     ifstreamObject.open("car.txt"); 


cout << "carType"<< ' '<< "reportingMark" << ' '<< "carNumber" <<' '<< "kind" <<' '<< "loaded"<<' '<<"destination"<< endl; 
      while(ifstreamObject >> carType >> reportingMark >> carNumber >> kind >> loaded >> destination) 
      {  cout <<"---------------------------------------------------------------------------"<<endl; 
        cout << carType<< ' '<< reportingMark << ' '<< carNumber <<' '<< kind <<' '<< loaded<<' '<<destination<< endl; 
      } 
0

Если бы я был вами, я попытался бы прочитать из файла функцию strtok.

Если вы хотите, вы можете прочитать для получения дополнительной информации strtok function

Я сделал эту задачу в последнее время, и я использовал strtok, потому что она позволяет Разделить каждую строку файла в список слов. Кроме того, это позволяет вам не назначать символы пунктуации, такие как пробелы и т. Д. (Так что я нашел это очень полезным)

Мой пример: Я хочу прочитать некоторые персональные данные из файла, такие как его расы, профессия, его hitpoints, его атаки и защиты.

Каждая строка моего файла кажется, что это: Человек/воин/15/7/7

Итак, я определяю указатель обугленного, которые хранят возвращаемое значение функции strtok и указатель обугленного, которые хранят слово чтения пока не найдете разделитель, который вы рассмотрели ранее. (В этом примере: «/»)

char* position = strtok(file, '/'); 
char* character_info = new char[size]; 

так, хранить строку в character_info и вы проверить значение позиции на каждой итерации, пока вы не закончите чтение файла.

while(position != NULL){ 
    // store position value 
    // call again strtok 
} 

Я надеюсь, что это будет полезно! =)

Cheers

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