2016-09-13 8 views
1

У меня возникли проблемы с чтением в двойных значениях в массив из файла после первой итерации цикла for, больше не видно из-за символа новой строки. Как я могу обойти эту проблему?При чтении формы файла, как учесть новые строки после использования оператора <<?

Пример входного файла:

слово

2,55

< слово --- как сейчас это не будет читать

5,66

file.open("productsIn.txt"); 
    if(!file.is_open()){ 
    cout << "Could not open file." << endl; 
    return 1; 
} 
if(file.is_open()){ 
    cout << "file open" << endl; 
    for(int i = 0; i < MAX_COUNT; i++){ 
     getline(file, productName[i]); 
     file >> prices[i]; 
     if(file.good()){ 
      cout << productName[i] << endl << prices[i] << endl; 
     } 
    } 
} 
    file.close(); 
+0

Не проблема, но вторая инструкция 'if' избыточна; если файл не открыт, функция возвращается из-за первого 'if' и не дойдет до кода, который пытается прочитать из файла. Кроме того, нет необходимости вызывать 'file.close()'; деструктор объекта 'file' сделает это. –

+1

Скорее всего [это] (http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction) - ваша проблема, но мне нужно будет увидеть образец содержимое файла обязательно. – NathanOliver

+1

Смешивание 'getline' с форматированными экстракторами является сложным. Продолжайте использовать 'getline' для чтения строк и создайте' std :: istringstream' для чтения удвоений из результирующего объекта 'string'. –

ответ

1

Если данные состоит из чередующихся строк имен и таких цен:

item 1 
1.50 
item2 
2.50 
... 

Вы, конечно, можете просто позвонить другие getline() после прочтения поплавка. Он будет считывать новую строку, которая находится в позиции чтения, и очистить аргумент фиктивной строки, который можно игнорировать. Это имеет смысл, потому что вы читаете две строки, поэтому вам могут понадобиться два getline s. (Вы можете сделать без getline() после имени, потому что форматированный вход для цены пропустит пробелы, но я думаю, что EOL является маркером для «конца имени», где имя может состоять из нескольких слов.)

Вы также можете использовать ignore или ws, как предложено в this complete answer.

Поскольку данные фактически линия ориентированные может быть яснее, последовать совету Пит Беккер и прочитать все строки с помощью getline(), разбора те, которые нуждаются в ней — как цены — просто через [i]stringstream.

+0

Я попытался использовать getline() для чтения в двойном значении, однако он не будет компилироваться из-за того, что getline не будет читать удвоения. Есть ли способ обойти это? – user3688675

+0

Просто вызовите 'getline()' снова с аргументом строки (фиктивный). После вызова строка будет пустой, поскольку позиция чтения находится в конце текущей строки, но новая строка, завершающая текущую строку, будет «переварена» (т.е. позиция чтения будет продвинута позади нее, до первого символа следующая строка) как побочный эффект 'getline()'. –