2014-01-26 2 views
1

Всякий раз, когда я запускаю свой код, я получаю первую строку, вытащенную из файла, но только первую. Есть что-то, чего я не хватает? Я столкнулся с проблемой, когда я применил stringstream, чтобы попробовать и более легко прочитать строки из шестнадцатеричного файла и быстрее преобразовать строку в шестнадцатеричное значение. Он читал в каждой строке соответственно раньше, но теперь это не так. Мне что-то не хватает в понимании того, как работает getline()?Как перемещаться по каждой строке в getline()

сс является stringstream, fileIn это файл, hexInput это строка, память [] представляет собой массив коротких междунар, команда представляет собой короткий INT, opCounter является ква ...

string hexInput; 
stringstream ss; 
short int instruction; 
ifstream fileIn ("proj1.txt"); 

if (fileIn.is_open()) 
{ 
    while (getline(fileIn, hexInput)) 
    { 
     ss << hex << hexInput; 
     ss >> instruction; 

     memory[opCounter] = instruction; 

     cout << hex << memory[opCounter] << '\t'; 
     cout << opCounter << '\n'; 

     ss.str(""); 
     opCounter++; 
    } 
    fileIn.close(); 
} 
else cout << "Unable to open file"; 

Выше вся функция (которая работала перед использованием stringstream) и ниже - это содержимое файла.

4000 
0033 
0132 
2033 
4321 
2137 
D036 
A00F 
B003 
C00C 
3217 
6217 
E044 
FFFF 
6016 
1013 
FFFF 
0 
0 
0 
0 
1 
2 
3 
4 
5 

Есть 26 линий и последний выход opCounter говорит «19» в шестнадцатеричном, который заставляет меня предположить, что файл будет строка за строкой читать, но stringstream никогда не обновляется. Это моя первая программа на C++ и я новичок в некоторых из этих функций, которые я пытаюсь реализовать. Спасибо за любую помощь ...

+2

Откуда вы знаете, что читаете только первую строку? – 0x499602D2

+0

Я предполагаю, что потому, что первый cout показывает, что является первой строкой файла, а второй показывает правильный приращение opCounter; Я также пробовал просто выводить инструкцию через каждый проход, но результаты точно такие же. –

+0

Можете ли вы показать нам больше кода, который касается этой конкретной проблемы? То есть, покажите нам, что происходит до запуска 'getline'. Также, пожалуйста, покажите нам содержимое файла. – 0x499602D2

ответ

2

Ваш строковый поток создается правильно из первой строки. После вывода числа в instruction оно будет eof, хотя (вы можете проверить это с помощью ss.eof()), потому что после первого номера внутри строкового потока данных нет.

заменить ss.str(""); (который вам не нужен) ss.clear();, который сбросит флаг eof. Ввод новой строки и чтение из потока будут работать, как ожидалось.

Конечно, в первую очередь нет необходимости в струйном потоке.

while (fileIn.good()) { 
    fileIn >> hex >> instruction; 
    [...] 
} 

работает нормально. Он будет читать короткие ints в шестнадцатеричном представлении, пока одна строка не будет интерпретироваться как таковая. (Что, кстати, является линией 7, потому что D036 слишком велик, чтобы вписываться в короткий int - по общему признанию, который отличается от вашего текущего поведения, но действительно ли вам нужен тихий отказ? Очень полезно в этот момент снова fileIn.eof(), чтобы проверить, не сработало ли чтение в связи с потоком будучи в конце файла и fileIn.clear() сбросить другие отказоустойчивость биты)

в соответствии с просьбой: петля сокращенно

while (fileIn >> hex >> instruction) { 
    [...] 
} 

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

+1

+1. Кроме того, вы можете изменить это на 'while (fileIn >> hex >> инструкция)' – 0x499602D2

+0

@ 0x499602D2 Это зависит. Он может захотеть проверить, не удалось ли прочитать чтение из-за флага 'eof' или потому, что число не помещалось внутри короткого int (в этом случае он мог бы, например, продолжить следующую строку) – example

+0

@ example: новички почти никогда не хотят делать это, и все остальные обычно делают, если после цикла while. Но, по крайней мере, упомянуть об этом в сообщении. Также 'ss.str (" ")' сбрасывает содержимое потока в соответствующих реализациях. –

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