2016-10-03 7 views
0

Вопрос Обновлен с помощью моего кода.Хранение каждой новой строки на два нуля из файла с использованием языка C

У меня есть файл в формате ниже. Каждая строка содержит целое число и float.

12 2.0 
11 1.1 

3 3.0 

Я хочу сохранить первые данные в каждой строке в переменную А, а вторые данные в переменной B.

В начале, я использую fscanf, чтобы сделать это, как показано ниже

while (1) { 
    int exit; 

    exit = fscanf(fp, "%d%f", &A, &B); 
    if (exit < 2) break; 
} 

Если я печатаю результат а и в, было бы

12 2.0 
11 1.1 
3 3.0 

Но на самом деле я хочу, чтобы сохранить символ новой строки как 2 нуля, например:

12 2.0 
11 1.1 
0 0 
3 3.0 

Некоторые веб-сайты предлагают использовать fgets/fgetc для чтения новой строки. Но я не могу понять, как fgets/fgetc может хранить целое число и плавать в var A и B.

Спасибо за внимание.

+1

_ Есть слишком много возможных ответов, или хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или изолировать проблему, на которую можно ответить в нескольких параграфах. –

+0

* Но я не могу понять, как fgets/fgetc может хранить целое число и плавать в var A и B. * - Действительно, они могут «т. Идея заключалась бы в том, чтобы заметить, когда 'fgets' читает пустую строку, а затем сохраняет нули в A и B вручную. Когда он не прочитал пустую строку, используйте 'sscanf' для ее анализа. Если у вас есть эта работа, реорганизуйте бит 'sscanf' для использования' strtod'/'strtol' вместо этого для лучшей надежности. – zwol

+0

(Обратите внимание на бит в документации 'fgets', где объясняется разница между тем, что вы получаете для пустой строки, и тем, что вы получаете для конца файла.) – zwol

ответ

4

Для каждой строки вызовите fgets() с достаточно большим буфером, чтобы удерживать любую строку, которую вы разумно ожидаете. Вместо fscanf вызовите sscanf в строке с точно такими же параметрами. Таким образом, программы теперь должны работать одинаково, за исключением того, что они отделяют IO от синтаксического анализа.

Теперь вы, кошка, усложняете анализ. если строка пуста (просто пробел), то два значения равны нулю. Если это не пробел, вызовите sscanf и попытайтесь разобрать, как раньше. Если оба сбой, у вас есть неверный ввод, поэтому сообщите об ошибке.

Кроме того, fgets вернет значение null, когда закончится ввод. Таким образом, вам не нужно использовать синтаксический разбор, чтобы больше не прекращать чтение.