fscanf в C ошибка сегментации - PullRequest
2 голосов
/ 15 декабря 2010

Я пытаюсь прочитать значения из файла и сохранить их в структуре.

Состав содержит

char region
char country[100]
int country_code

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

.

Файл, в котором я пытаюсь прочитать, выглядит следующим образом

Europe
0 France
1 England
2 Germany

Существует неисчислимое количество стран, поэтому он продолжает читать до 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++;
        }
    }

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

Ответы [ 4 ]

1 голос
/ 15 декабря 2010
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 голос
/ 15 декабря 2010
 myfile = fopen(countries,"r");

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

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);

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

    i++;

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

0 голосов
/ 16 декабря 2010

со структурой типа

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);
}
0 голосов
/ 15 декабря 2010

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

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

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

...