2014-09-10 2 views
-1

Я хотел бы создать функцию для чтения файла по строкам. Одна строка - одно имя.Как читать строки файла и получать их в массив в C?

int readConfig(char ** path, FILES ** files) 
{ 
    FILE* f; 
    f = fopen("file", "r"); 
    int ch; 
    while ((ch=fgetc(f)) != EOF) 
    { 

    } 
return 0; 
} 

Как использовать функцию fgetc для синтаксического анализа файла? И как получить результаты в файлах [count] .name?

+1

[getline] (http://linux.die.net/man/3/getline)? – Nelfeal

+2

http://stackoverflow.com/search?q=[c]+read+file+into+array –

+1

'& files' имеет тип' FILES * (*) [256] '.Он несовместим с 'FILES **'. Ваш компилятор должен предупредить об этом. –

ответ

3

Сразу:

char configFile [11] = "kernels.cfg"; 

[11] слишком мал. Попробуйте:

char configFile [12] = "kernels.cfg"; 

или

char configFile [] = "kernels.cfg";   /* let the compiler do the counting */ 

Также символ слишком мал для ч - использование:

int ch; 

Вы также можете найти fgets() - который читает целую строку в момент времени - проще в использовании, чем fgetc().

2

Вы получаете SIGSEGV из-за изменения строкового литерала, и это вызывает undefined behavior (например, ваш SIGSEGV). Я не уверен, что следует хранить в переменных filename и name. Если по линии:

strcpy(files[count].filename,'.bin'); 

вы хотели добавить».bin' к имени файла переменными, то этот подход является неправильным. Вы должны использовать strcat. strcpy будет писать в filename с начала этой переменной, поэтому некоторые ранее сохраненные символы будут перезаписаны. strcpy также добавляет нулевой символ завершения, поэтому, если вы хотите распечатать его, printf остановится на этом \0 char и больше не пойдет. Однако реальная проблема заключается в том, что вы должны выделить malloc пространство для переменных в структуре. Тогда вы сможете их модифицировать.

Рассмотрим простой пример:

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

struct file { 
    char* name; 
    char* filename; 
}; 

int main(void) 
{ 
    struct file x; 
    x.name = malloc(30); 
    x.filename = malloc(40); 

    strncpy(x.name, "copied_string", 13); 
    printf("%s\n", x.name); 

    strcat(x.name, "_suffix"); 
    printf("%s\n", x.name); 

    strcpy(x.name, "erased"); 
    printf("%s\n", x.name); 

    free(x.name); 
    free(x.filename); 
    return 0; 
} 

выход:

copied_string 
copied_string_suffix 
erased 

Это должно сделать его немного более ясно, что происхождение вашей аварии. Вы также должны рассмотреть возможность использования fgets или getline. Запомнить free что у вас есть malloc 'd.

EDIT:

Вызов readConfig(&path, &files); результатов при переходе к readConfig указатель типа FILES (*)[256]. Рассмотрим изменение FILES files[256]; к

FILES* files = malloc(sizeof(FILES)*256); 

, а затем обратитесь к функции, как readConfig(&path, files);

Тогда вы бы перейти к readConfig функционировать совместимый тип files.

+0

Спасибо. Но strncpy не нужен, не так ли? Я использую strcpy для копирования имени в .name и для копирования .name в .filename. Тем не менее, я ударяю ошибку, когда пытаюсь скопировать '.bin'. Ах, это проблема. Должно быть «.bin», а не одинарные кавычки. Но как я должен освободить память, следует ли использовать свободные (файлы) или создавать функцию с помощью цикла, освобождать все члены его элементов ... free (files [count], name); free (files [count], filename); Я верю, что второе верно. На самом деле спасибо за бесплатное() уведомление! –

+1

strncpy не требуется, но это безопаснее :) Вы должны явно освободить то, что вы выделили. Если член структуры был назначен с помощью malloc, освобождение структуры не освободит память, принадлежащую этому члену (если даже структура была также распределена с помощью malloc, это может быть просто переменная в стеке). – macfij

+0

Я дал вам несколько советов. – macfij