2014-09-02 3 views
0

У меня есть текстовый файл, который я читаю в именах и фамилиях в массиве символов размером 20. Я создаю массив структур, который содержит информацию «People». Текстовый файл выглядит следующим образом:fscanf() read error

John Robbins 
Teresa Jones 

моя структура определяется как таковую:

struct people { 

char name[20]; 
}; 

Декларация Лица структура:

struct people *persons[2]; 

После объявления нового-структуру, я прочитал в имен со следующим кодом:

for(i=0; i<2; i++) 
{ 
    fscanf(dp, "%[^\n]s", &persons[i].name[20]); 
} 

Однако после выхода I имена в консоль я получаю следующее:

hn Robbins 
sa Jones 

Я сделал обширные исследования и не могу найти решение этой проблемы. Кто-нибудь испытал эту проблему?

+0

Показать объявление массива людей пожалуйста. – JeremyP

+0

Просто добавлено объявление структуры «Персоны» – KryptNick

+0

Является ли это опечаткой, которую вы заглавили в декларации лиц, но не когда вы ее используете? – JeremyP

ответ

5
fscanf(dp, "%[^\n]s", &persons[i].name[20]); 

Это читает строки до символа новой строки, а затем пытается прочитать s, которая будет выполнена. Строка до символа новой строки будут сохранены после окончания name массива в ваших людей STRUCT (что означает, что он будет перезаписывать в следующий элемент persons массива

Вы хотите что-то вроде:.

fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name); 

вместо этого - начальное пространство пропускает ведущие пробелы (включая любую новую строку из предыдущей строки). %19[^\n] читает до 19 символов или до новой строки и сохраняет его, за которым следует завершающий NULL (так что будет использовать весь 20-байтовый name массив, но не более). %*[^\n] будет читать любые дополнительные символы в строке до (и не включая) newl и бросить их.

Вы также хотите, чтобы проверить возвращаемое значение fscanf вызова, чтобы убедиться, что не получает ошибку или конец файла:

#define MAX_PEOPLE 2 
struct people persons[MAX_PEOPLE]; 

i = 0; 
while (i < MAX_PEOPLE && fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name) > 0) 
    i++; 
+0

Это должно быть 'person [i] -> name' согласно опубликованной декларации' people'. – JeremyP

+0

Да, ему нужно изменить объявление на 'struct people people [2];' или код, который у него был, даже не будет компилироваться. Создание массива указателей добавляет необходимость выделить пространство для него. –