2016-02-13 3 views
0

В следующем коде я не могу использовать класс std::string.Как пропустить пустые строки без класса строк

Я пытаюсь прочитать файл с пустыми строками, и я хочу игнорировать пустые строки, когда я сталкиваюсь с ними.

Я проверил некоторые идеи с использованием упрощенного примера и созданного текстового файла, содержащего пустые строки.

int main() { 
    ifstream fin; 
    fin.open("test.txt"); 
    if(fin.fail()){ 
     cout << "Input file fail."; 
     exit(-1); 
    } 

    char line[10]; 

    while(!fin.eof()){ 
     fin.getline(line, 10); 
     if(line[0] == '\n') 
      cout << "skip" << "\n"; 
     else 
      cout << line << "\n"; 
    } 
} 

Я также пытался что-то вроде strlen(line) == 1, но ничего не работает до сих пор.

В чем проблема?

+4

См. [Почему iostream :: eof внутри условия цикла считается неправильным?] (Http://stackoverflow.com/q/5605125/2069064) – Barry

+0

'std :: getline()' отбрасывает разделитель, что объясняет почему ни одно из ваших решений не будет работать. –

+0

* Нам не разрешено использовать класс строк * - Так что вы можете также назвать свой курс * C-программированием * вместо * C++-программирования *. – PaulMcKenzie

ответ

1

std::getline() уже заботится о характере '\n' (он будет отброшен), line[0] будет содержать '\0' в случае пустого ввода.

Просто сравните для '\0' вместо '\n':

if(line[0] == '\0') 
    cout << "skip" << "\n"; 
else 
    cout << line << "\n"; 

Я также пробовал такие вещи, как strlen(line) == 1

Если да, то следует не то, что было strlen(line) == 0 для пустой линия?

1

Есть две проблемы с вашим кодом. Во-первых, ваша петля неверна. Вы должны проверить результат звонка getline(), а не eof(). См. Why is iostream::eof inside a loop condition considered wrong. Это перестроенная петля становится:

while (fin.getline(line, 10)) { 
    ... 
} 

Далее, когда вы читаете строку с getline() (и 10 кажется действительно короткие для строки), разделитель не будет частью тела. Когда вы будете читать, в line не будет \n. У вас будет только пустая строка. Таким образом, правильный способ сбросить пустые строки:

while (fin.getline(line, 10)) { 
    if (line[0]) { 
     // we have contents! 
    } 
} 

Или действительно, std::string просто способ лучше:

std::string line; 
while (std::getline(fin, line)) { 
    if (!line.empty()) { 
     .... 
    } 
} 
0

std::getline() отбрасывает разделители \n. Но вы также можете подумать, что на некоторых системах линии могут быть разделены на \r\n.

+0

'std :: getline()' отбрасывает '\ r \ n'. –

+0

@ πάνταῥεῖ Это также, если вы передаете файлы между разными системами? – Zulan

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