2014-10-01 2 views
-2

Итак, у меня есть эта функция из одной из моих программ и до того, как она дала мне все эти (-9.25596e + 061) и только первую строку. Но тогда я поставил { «»} в моем GetLine и получил его напечатать весь файл, но все еще есть номера (который дамп памяти правильно?)Функция с getline, дающая дополнительный вывод

void getMenuFromFile(ifstream& inFile, menuItemType menu[], int menuSize) { 
    for (int i = 0; i < menuSize; i++) { 
     getline(inFile, menu[i].menuType, ','); 
     inFile >> menu[i].menuPrice; 
     inFile.ignore(); 
    } 
} 

Вход:

Plain Egg   $1.45 
Bacon and Egg  $2.45 
Muffin    $0.99 
French Toast   $1.99 
Fruit Basket   $2.49 
Cereal    $0.69 
Coffee    $0.50 
Tea     $0.75 

Выход:

Plain Egg   $1.45 
Bacon and Egg  $2.45 
Muffin    $0.99 
French Toast   $1.99 
Fruit Basket   $2.49 
Cereal    $0.69 
Coffee    $0.50 
Tea     $0.75 
-9.25596e+061 

-9.25596e+061 

-9.25596e+061 

-9.25596e+061 

-9.25596e+061 

-9.25596e+061 

-9.25596e+061 

-9.25596e+061 
Press any key to continue . . . 
+0

Просьба MCVE. Вероятно, вы, вероятно, не проверяете состояние потока. – AndyG

+0

Что такое MCVE @AndyG – ashinKUSHR

+0

http://stackoverflow.com/help/mcve – AndyG

ответ

1

Ваш код имеет ряд проблем:

  • Вы говорите std::getline, чтобы остановиться в ',', но ваш вход не содержит. Следовательно, он потребляет весь файл при первом вызове. В конце концов, вы решили использовать вместо этого '$'?

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

    if (!inFile) { cerr << "damn it!\n"; } 
    
  • Даже если проблемы были исправлены, вы все равно не хранить 1.45 и все остальные цены в качестве int. Может, вы хотели вместо этого float?

Ваш выход поступает так:

Во-первых, вы видите все содержимое файла, который вошел в menu[0].menuType. Для всех остальных записей вы получаете пустую (по умолчанию построенную) строку и случайные значения мусора, которые оказались в памяти для цен (поскольку int s не инициализированы значением).

Update: После рассмотрения вашего выхода, я сомневаюсь, что menuItemType::menuPrice является int как вы сказали в своем комментарии. Разве это уже не float или double? Остальные проблемы, упомянутые выше, остаются.

0
void showMenu(menuItemType menu[], int menuSize) 
{ 


    for (int i = 0; i < menuSize; i++) 
    { 
     cout << menu[i].menuType << endl; 
     //cout << menu[i].menuPrice << endl; 
    } 


} 

Спасибо @AndyG, я мог бы опубликовать неправильную функцию, но вы заставили меня указать, была ли проблема. Чтобы избавиться от лишних чисел, я прокомментировал второй cout, это было не нужно.

выход

Plain Egg   $1.45 
Bacon and Egg  $2.45 
Muffin    $0.99 
French Toast   $1.99 
Fruit Basket   $2.49 
Cereal    $0.69 
Coffee    $0.50 
Tea     $0.75 
+0

Это не отвечает на вопрос. Поэтому вы должны лучше отредактировать свой вопрос, чтобы добавить эту информацию, а не дать ему ответ. Тем не менее, он все еще не делает для MCVE. – 5gon12eder

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