Как я могу прочитать файл слово за словом, используя stdio.h в C? - PullRequest
0 голосов
/ 06 марта 2011

Я новичок в C и не могу получить его без ошибки сегментации.

Вот моя идея на данный момент:

#include<stdio.h>
#include<string.h>

char *nextWord(FILE *stream) {
    char *word;
    char c;

    while ( (c = (char)fgetc(stream)) != ' ' && c != '\n' && c != '\0') {
        strcat(word, &c);
    }

    return word;
}

int main() {
    FILE *f;
    f = fopen("testppm.ppm", "r");
    char *word;
    word = nextWord(f);
    printf("%s",word);
} 

Ответы [ 2 ]

1 голос
/ 06 марта 2011

В вашей функции nextWord вы никогда не инициализируете локальную переменную word, чтобы указывать на что-либо, поэтому при попытке записи в указанную память с помощью strcat вы получаете ошибку segfault.

Вам нужно выделить память для хранения слова, которое вы собираетесь прочитать. Проблема в том, что вы не знаете, насколько большим будет это слово, поэтому вы не знаете, сколько места выделить. Существует несколько возможных подходов:

  • Используйте (большой) буфер фиксированного размера в стеке, чтобы удерживать слово во время чтения, а затем скопируйте его в область malloc соответствующего размера при возврате. Будут проблемы, если вы встретите слово, которое слишком велико для вашего буфера фиксированного размера.

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

0 голосов
/ 06 марта 2011

Или вы также можете использовать функцию fscanf в цикле while.

 char *nextWord(FILE *stream) {  
    char *buffer[124], *word;
     int previous_size = 0;

     while(!feof(!stream)){
         int n = fscanf(file, "%s", buffer);
         if(word == NULL){
            word = malloc(sizeof(char)*n)
         } else {
           realloc(word, n + previous_size);
         }
         strncat(word, buffer, strlen(buffer) - 1);        
         previous_size = n;
      }
      return word;

 }

Небольшое объяснение.Функция fscanf возвращает количество прочитанных символов.Поэтому первое, что я делаю, это сохраняю это значение.Если word равно NULL, вы выделяете его с количеством символов, в противном случае вы назначаете слово с помощью переменной previous_size Не забудьте очистить буфер переменную

...