2015-10-11 5 views
0

Я пытаюсь заполнить массив из текстового файла. массив в структуры, которая:Чтение строки из текстового файла в массив символов в c

struct ISBN 
{ 
    long value; 
}; 
struct Author 
{ 
    char authorName[60]; 
}; 
struct Book 
{ 
    char *bookTitle; 
    struct Author bookAuthor; 
    struct ISBN bookID; 
}; 

Я попытался написать функцию, которая принимает FILLIN файла и типа-структуру книги, как это:

void fillin (FILE * file, struct Book * bk) 
{ 
    bk->bookTitle =(char*) malloc(1000); 
    size_t n = 0; 
    int c; 

    file=fopen("book.txt","r"); 

    while ((c = fgetc(file)) != '\n') 
    { 
     bk->bookTitle[n++] = (char) c; 
    } 

    bk->bookTitle[n] = '\0'; 

    fscanf(file,"%s", &bk->bookAuthor.authorName); 
    fscanf(file,"%lld",&bk->bookID.value); 

    //fscanf(file,"%s", &bk->bookTitle); 
} 

Файл book.txt имеет эти данные :

UNIX Network Programming 
W. Richard Stevens 
0131411551 

проблема заключается в том, что не может сканировать массивы и я хочу, чтобы заполнить BOOKTITLE и autherName массивы из текстового файла.

ответ

0

Следующая строка является неправильным:

fscanf(file,"%s", &bk->bookAuthor.authorName); 

При сканировании строки, массив символов уже указатель, так что вам не взять адрес этого (&). Попробуйте:

fscanf(file,"%s", bk->bookAuthor.authorName); 

Для обеспечения безопасности (в случае длинных строк), вы можете использовать эту функцию:

char * fgets (char * str, int num, FILE * stream); 

Следовательно:

fgets(bk->bookAuthor.authorName, 60, file); 

Если линия слишком долго, остальные строки не будут скопированы. Если вы это сделаете, вам может потребоваться проверить, не закончилась ли строка, и выбросить остальные символы до новой строки. (например, while ((c = fgetc(file)) != '\n');). \ П символ копируется, поэтому вам придется найти и удалить его:

bk->bookAuthor.authorName[59] = 0; // make sure it is null-terminated 
int last = strlen(bk->bookAuthor.authorName)-1; 
if (bk->bookAuthor.authorName[last] == '\n') { 
    bk->bookAuthor.authorName[last] = 0; // read whole line 
} 
else ; // terminated early 

Вы также можете ограничить символы с fscanf и читать пространства, а также, используя:

char c; 
scanf(file, "%60[^\n]%c", bk->bookAuthor.authorName, c); 

if (c=='\n') { 
    // we read the whole line 
} else { 
    // terminated early, c is the next character 
    //if there are more characters, they are still in the buffer 
} 

Для отказаться от остальной части линии, вы можете сделать что-то вроде

while (c != '\n' && c != EOF) c = fgetc(file); 
+0

'fscanf (файл "% S", bk-> bookAuthor.authorName);' не будет сканировать в 'W. Ричард Стивенс и 2) 'fgets (bk-> bookAuthor.authorName, 60, file);' излишне добавляет '\ n' к имени автора. Оба подхода, как есть, не работают, чтобы решить пост OP. Примечание: строки никогда не «еще не завершены». 'char' массивы часто не заканчиваются нулевым символом. – chux

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