EXC_BAD_ACCESS загрузка int с помощью fscanf - PullRequest
1 голос
/ 31 января 2012

Прошло очень много времени с тех пор, как я написал код на C, и я потратил около двух часов на поиски правильного использования fscanf. Насколько я могу судить, этот код правильный, но я получаю EXC_BAD_ACCESS каждый раз, когда запускаю его:

int rasterWidth;
int rasterHeight;
FILE* f = fopen("scene.u2d","r");

if (f == NULL)
{
    perror("Can't open file!");
}

char m [2];
fscanf(f, "%s", m);
fscanf(f, "%d %d",&rasterWidth,&rasterHeight); // Getting EXC_BAD_ACCESS here

printf("%s %d %d",m,rasterWidth,rasterHeight);

Я убедился, что XCode открывает нужный файл (он правильно загружает первые два символа). scene.u2d выглядит так:

U2
500 500
-1.0 -1.0 1.0 1.0
g triangle.raw
c 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1
s 0.5 1.0
t 0.3 -0.2

Есть ли что-то очевидное, что я делаю не так? Спасибо!

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Во-первых, справочная страница для scanf гласит:

s Соответствует последовательности непробельных символов; следующий указатель должен быть указателем на массив символов, который является достаточно длинным для хранения входной последовательности и завершающего нулевого символа ('\0'), который добавляется автоматически. Строка ввода останавливается в пустом пространстве или при максимальной ширине поля, в зависимости от того, что произойдет раньше.

Это означает, что вам нужно по крайней мере char m[3] для этого входного файла из-за нулевого терминатора.

Я бы также рекомендовал использовать %2s в качестве спецификатора формата, чтобы не переполнять буфер.


Если это не проблема, пытались ли вы запустить только тот фрагмент кода, который вы разместили? Это работает для меня - я подозреваю, что есть некоторое неправильное управление памятью перед отправленным кодом. Или ваш код на самом деле что-то вроде:

int *rasterWidth, *rasterHeight;

fscanf(f, "%d %d",rasterWidth,rasterHeight); // this is definitely a bad access 

Неправильный доступ к вызовам scanf часто вызван передачей неинициализированных указателей.

2 голосов
/ 31 января 2012

Чтобы уточнить мой комментарий и уточнить, в чем я вижу проблему.

fscanf(file,"%s", &buff)

Поместит [string \ 0] в бафф, поэтому бафф должен быть как минимум на 1 символ длиннее любой возможной строки, которая будет прочитана.

1 голос
/ 31 января 2012
#include<stdio.h>
int main()
{
    int rasterWidth = 0;
    int rasterHeight = 0;
    FILE* f = fopen("scene.u2d","r");

    if (f == NULL)
    {
         perror("Can't open file!");
    }

    char m [3]; //  or give enough space in buffer to hold any string -- 
                   // char m [256];
    fscanf(f, "%s", m);

    fscanf(f, "%d %d",&rasterWidth,&rasterHeight);
    printf("%s\t %d\t %d",m,rasterWidth,rasterHeight);     
}

Я думаю, этот код поможет,

...