2010-12-15 2 views
2

Я пытаюсь читать значения из файла и хранить их в структуре.fscanf in C segmentation error

Структура содержит

char region 
char country[100] 
int country_code 

Экземпляр этой структуры называется с [100]

файла, который я пытаюсь читать выглядит так

Europe 
0 France 
1 England 
2 Germany 

Есть все unkonwn количество стран, поэтому он продолжает читать до EOF.

Я создал массив структур.

код я до сих пор выглядит следующим образом:

fp= fopen(countries,"r"); 

    while (!feof(fp)) 
    { 
    fscanf(fp, "%[^\n]", c.region); 
     while (!feof(fp)) 
     { 
     fscanf(fp, "%d, %[^\n]", c[i].country_code, c[i].country); 
     i++; 
     } 
    } 

Я получаю ошибку сегментации. Я уверен, что что-то очевидно, что ive пропустил или сделал неправильно, но я не уверен, что, и я был бы признателен, если бы кто-нибудь мог помочь.

+2

Не используйте функцию feof() для управления контуром. http://c-faq.com/stdio/feof.html – Nyan 2010-12-15 14:55:02

ответ

0

Вам нужно взять адрес из country_code и страновых полей:

fscanf(myfile, "%d, %[^\n]", &c[i].country_code, &c[i].country); 

Otherwize fscanf будет intepret этих двух целочисленных значений в качестве указателей, и попытаться хранящих данные в них => ошибка сегментации.

+0

c [i] .country уже является массивом символов, нет и здесь. – 2010-12-15 14:06:22

+0

Вы правы, что нет необходимости в & для страны. Однако это не `char`, это массив char (` char [100] `). При передаче массива char в качестве параметра функции, компилятор преобразует его в указатель char `(char *)`. – 2010-12-15 14:10:40

1
fscanf(myfile, "%d, %[^\n]", c[i].country_code, c[i].country); 

должны быть прикреплены к

fscanf(myfile, "%d, %[^\n]", &(c[i].country_code), c[i].country); 

, как fscanf необходим адрес для записи данных. Вам не нужно использовать & для массива char, поскольку он уже является указателем.

Кроме того, в вашей структуре char region; следует изменить на char region[100];, так как у вас нет одного символа для региона, но несколько, IOW строка.

1
myfile = fopen(countries,"r"); 

Проверьте возвращаемое значение для errrs

while (!feof(myfile)) 
{ 
fscanf(myfile, "%[^\n]", c.region); 

Вам нужно передать адрес c.region: &c.region. Тем не менее, это все еще неправильно, поскольку вы выделяете только один символ, а fscanf будет читать символы до несоответствия. Вы должны изменить объявление c.region как массив символов c.region[[00] или что-то в этом роде.

Кроме того, c является массивом, а не структурой, поэтому я не думаю, что это код, который вы фактически используете. Вы имели в виду c [0] .region?

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

Где вы устанавливаете i в ноль?

while (!feof(myfile)) 
    { 
    fscanf(myfile, "%d, %[^\n]", c[i].country_code, c[i].country); 

Опять же, вам нужно передать адрес поля код_страны &c[i].country_code".Обратите внимание, что вам необязательно использовать оператор & в поле страны, хотя другие ответы пока говорят, что вы делаете, поскольку страна является массивом символов, и поэтому c [i] .country совпадает с & c [i]. страна

i++; 

Что произойдет, если в файле больше строк, чем выделенных записей в массиве c [i]?

0

с структуры, как

char region[100] 
char country[100] 
int country_code 

он должен работать, например.

char aregion[100]="", line[100]; 
... 
while(fgets(line,100,myfile)) 
{ 
    if(*aregion && 2==sscanf(line,"%d%99[^\n]",&c[i].country_code,c[i].country)) 
    strcpy(c[i++].region,aregion); 
    else 
    if(!strchr(line,' ')) 
    sscanf(line,"%99[^\n]",aregion); 
}