чтение данных из файла в c - PullRequest
2 голосов
/ 18 мая 2011

У меня есть текстовый файл с именем prob, который содержит:

  6 2 8 3
4   98652
      914
143   789
    1    
527   146
 85      
 1 74   8
7   6 3  

В каждой строке 9 символов и 9 строк.Так как я не могу сделать массив строк в c, я использую двумерный массив.Тщательный запуск кода, бесконечные циклы распространены, и это выводит странный вывод.Мне также любопытно, где это прекращает брать в последовательности?до новой строки?ожидаемый результат для каждого «сохранения»: 6 2 8 3 или независимо от содержащейся строки.

#include <stdio.h>
FILE *prob;

main()
{ 
    prob = fopen("prob.txt", "r");

    char grid_values[9][9];
    char save[9];

    int i;
    for (i = 0; (fscanf(prob, "%s", save) != EOF); i++)
    {
        int n;
        for (n = 0; n <= 9; n++)
        {
            grid_values[i][n] = save[n];
            printf("%c", grid_values[i][n]);
        }
    }
    fclose(prob);
}

Ответы [ 2 ]

4 голосов
/ 18 мая 2011

Это похоже на домашнее задание, поэтому я постараюсь дать вам несколько полезных советов.

Сначала прочтите описание функции fscanf и описание преобразования "% s".

Вот фрагмент из описания, которое у меня есть для "% s":

Соответствует последовательности символов, не являющихся пробелами;следующий указатель должен быть указателем на массив символов, который достаточно длинный, чтобы содержать входную последовательность и завершающий нулевой символ ('\ 0'), который добавляется автоматически.Входная строка останавливается на пустом месте или на максимальной ширине поля, в зависимости от того, что произойдет раньше.

Вот два важных момента:

  • Каждая из ваших строк ввода содержит числаи пробельные символы.Таким образом, функция прочитает число, достигнет пробела и остановится.Он не будет читать 9 символов.
  • Если он прочитал 9 символов, в вашем массиве недостаточно места для хранения необходимых 10 байт .Обратите внимание, что будет добавлен завершающий нулевой символ.Прочитано 9 символов, плюс 1 ноль, равно 10. Это распространенная ошибка в программировании на C, и лучше всего научиться теперь всегда учитывать завершающий ноль в любой строке C.

Теперь, чтобыисправьте это, чтобы прочитать символы в двумерном массиве: вам нужно использовать другую функцию.Просмотрите список функций C stdio.

Увидите что-нибудь полезное звучание?

Если нет, я дам вам подсказку: fread.Он будет читать фиксированное количество байтов из входного потока.В вашем случае вы можете указать, чтобы он всегда читал 9 байтов.

Это сработало бы, только если каждая строка гарантированно дополняется до 9 символов.

Другая функцияэто fgets.Опять же, внимательно прочитайте документацию по функциям.fgets - еще одна функция, которая добавляет завершающий ноль.Тем не мение!В этом случае, если вы укажете fgets размером 9, fgets будет читать только 8 символов и записывать завершающий ноль в качестве 9-го символа.

Но есть и другой способ!Вернуться к FSCANF!

Если вы посмотрите на другие спецификаторы преобразования, вы можете использовать "% 9c", чтобы прочитать 9 символов.Если вы используете эту операцию, она не будет добавлять завершающий нуль в строку.

Используя fread и fscanf "% 9c", если вы хотите использовать эти 9 байтов в качестве строки в других функциях, таких как printf, вам потребуется сделать ваши буферы 10 байтами, и после каждой функции fread или fscanf выпотребуется написать save[9] = '\0'.

Всегда внимательно читайте документацию.Строковые функции C иногда делают это одним способом. Но не всегда.

3 голосов
/ 18 мая 2011

если вы используете fscanf, он будет остановлен после пробела.

попробуйте fgets сделать это .. Он будет читать построчно ..

for (i = 0; (fgets(save, sizeof(save), prob) != EOF); i++)

подробности использования fgets можно найти здесь:
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

- отредактированный -

вот второй

while(!feof(file))
{
    fgets(s, sizeof(s), file); ......
}

Я думаю, что это будет хорошо работать ..

...