#c #arrays #file #fault
#c #массивы #файл #ошибка
Вопрос:
Я очень новичок в программировании и пытаюсь написать код, который считывает «numbers.tsv4» (.tsv4 означает значения, разделенные табуляцией, по 4 в строке) и помещает числа в массив. Прямо сейчас я просто сосредотачиваюсь на подсчете количества чисел в файле, чтобы я мог инициализировать размер массива.
int main(void)
{
int cur;
FILE* spData;
int size=1;
spData = fopen("numbers.tsv4", "r");
while ((cur = fgetc(spData)) != EOF) {
if ((cur = fgetc(spData)) == 't') {
size ;}
}
fclose(spData);
printf("%d", size);
return;
}
Я продолжаю получать ошибку сегментации, и я изменил так много вещей, чтобы попытаться разобраться в этом. Кто-нибудь может мне помочь? Спасибо!
Комментарии:
1. Наиболее вероятная причина вашего segfault в том, что «numbers.tsv4» не существует, fopen возвращает NULL, вашему коду не удается его проверить, и fgetc (NULL) вылетает. P.S. В противном случае общая логика в любом случае полностью нарушена. В среднем не удастся подсчитать половину символов табуляции в файле.
2. Вы отладили его, чтобы точно выяснить, что происходит до сбоя в сегментации?
Ответ №1:
Проблема в структуре вашего оператора while. В начале каждой итерации вы уже получаете следующий символ с fgetc()
и присваиваете его cur
. Затем внутри цикла, в if(...)
инструкции, вы отбрасываете cur
, вызывая new fgetc()
и присваивая результат cur
. Итак, измените его следующим образом:
while ((cur = fgetc(spData)) != EOF) {
if (cur == 't') {
size ;}
}
Видите ли, когда вы пытаетесь вызвать fgetc()
дважды (оба в while(...)
и if(...)
), вы, вероятно, получаете инструкцию EOF
in if(...)
. Затем на следующей итерации с помощью while(...)
инструкции вы пытаетесь получить доступ к чему-либо вне файла, что приводит к ошибке сегментации.