Ошибка сегментации при открытии файлов - PullRequest
0 голосов
/ 11 декабря 2018

Итак, я пытаюсь открыть 2 файла, каждый из которых имеет три строки и 2 числа.После компиляции я запускаю его в терминале (я использую Ubuntu ftr) как

./a.out a.txt+b.txt

, и он ничего не возвращает.Когда я закомментирую часть кода «проверьте, правильно ли он открывается», он просто выплевывает некоторые цифры и выводит сообщение об ошибке «Ошибка сегментации (ядро сброшено)».Я действительно не знаю, что я делаю неправильно, так как этот кусок кода работает хорошо для моих друзей.Я поставил оскорбительный код ниже.(Остальная часть кода предназначена для выполнения операций с числами, поэтому между именами файлов есть плюс.)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(int argc, char** argv){
    FILE* fa = fopen(argv[1],"r"); if(!fa)exit(1);
    FILE* fb = fopen(argv[3],"r"); if(!fb)exit(1); 
    int k;
    double A[3];
    double Ag[3];
    double B[3];
    double Bg[3];

    for (k=0;k<3;k++){
        fscanf(fa, "%lf %lf", &A[k], &Ag[k]);
        fscanf(fa, "%lf %lf", &B[k], &Bg[k]);
    }
    for (k=0;k<3;k++){
        printf("%lf %lf\n", A[k], Ag[k]);
        printf("%lf %lf\n", B[k], Bg[k]);
    }
    fclose(fa);
    fclose(fb);

return 0;}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

(В дополнение к другому ответу :) эта часть вашего кода

for (k=0;k<3;k++){
    fscanf(fa, "%lf %lf", &A[k], &Ag[k]);
    fscanf(fa, "%lf %lf", &B[k], &Bg[k]);
}

пытается прочитать из fa шесть раз.Предположительно, вы хотели прочитать из fb во второй строке.

0 голосов
/ 11 декабря 2018

С ./a.out a.txt+b.txt вы передаете два параметра (т.е. имя исполняемого файла ./a.out и a.txt+b.txt, а не три. Поэтому, когда вы получаете доступ к FILE* fb = fopen(argv[3],..., вы выходите за пределы argv и получаете неопределенное поведение.

Всегда проверяйте argc перед доступом к argv и продолжайте проверять значения NULL:

if (argc < 3) {
   printf("wrong number of arguments.");
   exit(1);
}
FILE* fa = fopen(argv[1],"r"); if(!fa)exit(1);
FILE* fb = fopen(argv[2],"r"); if(!fb)exit(1);

А затем - чтобы передать два имени файла - назовите его как

./a.out a.txt b.txt
...