Ошибка сегментации при открытии файла на C?

#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(...) инструкции вы пытаетесь получить доступ к чему-либо вне файла, что приводит к ошибке сегментации.