нужна помощь в устранении ошибки сегментации с файловым вводом / выводом в C - PullRequest
1 голос
/ 19 января 2010

Я прочитал входной файл, который имеет 911 строк, и хочу скопировать эти 911 строк в выходной файл после внесения нескольких изменений в каждую строку

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

#include<stdio.h>
void main()
{
    int i;
    FILE *fin,*fop;char* str;
    fin=fopen("atk561011.txt","r");
    if(fin=NULL) printf("ip err");
    fop=fopen("svmip.txt","w");
    if(fop=NULL) printf("op err");
    for(i=1;i<=911;i++)
    {
        fgets(str,150,fin);
        if((i>300&&i<=360)||(i>600&&i<=660)) 
            str[7]='1';
        else 
            str[7]='0';
        fputs(str+7,fop);
        putc('\n',fop);
    }
    fclose(fin);
    fclose(fop);
}

Ответы [ 4 ]

4 голосов
/ 19 января 2010

Для начала, это неправильно:

if(fin=NULL)

Должно быть:

if (fin == NULL)

(то же самое относится и к fop, конечно). И если вам не удалось открыть файл - не просто распечатайте ошибку, выйдите, потому что вы собираетесь читать? Имейте в виду, что вывод printf буферизован, и в случае segfault вы не всегда будете его видеть вообще, даже если он работал до сбоя.

Другое дело: вы не выделяете память для str, но пишете в нее с помощью fgets.

И еще одна вещь: чтение заранее определенного количества строк из файла, вероятно, плохая идея. Из входных данных лучше читать до конца файла или до тех пор, пока не будет прочитано необходимое количество строк.

1 голос
/ 19 января 2010

Вот исправленный код, который должен это сделать.

#include
#define MAX_BUF   150
void main()
{
    int i;
    FILE *fin,*fop;char* str;
    str = malloc((MAX_BUF * sizeof(char)) + 1);
    if (str == NULL){
       printf("Out of memory\n");
       exit(-1);
    }
    fin=fopen("atk561011.txt","r");
    if(fin == NULL){
        printf("ip err");
        exit(-2);
    }
    fop=fopen("svmip.txt","w");
    if(fop == NULL){
        printf("op err");
        exit(-3);
    }
    for(i=1;i<=911;i++)
    {
        fgets(str,150,fin);
        if((i>300&&i<=360)||(i>600&&i<=660)) 
            str[7]='1';
        else 
            str[7]='0';
        fputs(str+7,fop); 
        // What is that for? should it be
        // fputs(str, fop); ????? 
        // since you're outputting the 7'th character (1/0)?
        putc('\n',fop);
    }
    fclose(fin);
    fclose(fop);
    if (str != NULL) free(str);
}

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

Редактировать: Пожалуйста, см. Комментарий выше в коде. Вы пытаетесь вывести 1/0 на основе условного значения i между диапазонами 300-360 и 600-660 включительно, в выходной файл. Вы можете уточнить? Должно ли это быть

fputs(str[7], fop);

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 19 января 2010

Вы не выделяете место для указателя str.

Измените это на char str [/ * Максимальная длина Вы ожидаете 150? * /] или выделите буфер.

Тем временем ваш код перемещается по всей памяти - таким образом, ошибка сегментации.

0 голосов
/ 19 января 2010

Оба fin = NULL и fop = NULL должны оба использовать оператор «равный-равный». Вы устанавливаете fin и fop в NULL вместо проверки на неправильное возвращаемое значение.

...