需要帮助解决C中文件i / o的分段错误

时间:2010-01-19 19:00:06

标签: file segmentation-fault

我读取了输入文件,该文件有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 个答案:

答案 0 :(得分:4)

首先,这是错误的:

if(fin=NULL)

应该是:

if (fin == NULL)

(当然,fop同样如此)。如果你没有成功打开文件 - 不要只是打印错误,退出,因为你要读什么?请记住,printf的输出是缓冲的,如果出现段错误,即使它在错误发生之前运行,也不会总是看到它。

另一件事:您没有为str分配内存,而是使用fgets写入内存。

另一件事:从文件中读取预定义的行数可能是一个坏主意。最好从输入读取,直到文件结束,或者直到读取了所需的行数。

答案 1 :(得分:1)

你没有为指针str分配任何空间。

将其改为char str [/ *最大长度你期望150? * /]或分配缓冲区。

与此同时,你的代码遍布内存 - 因此是分段错误。

答案 2 :(得分:1)

以下是应该执行的更正代码。

#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循环,这将导致执行失败,因为它仍然会尝试在失败时从不存在的文件句柄中读取。

修改:请在代码中查看上面的评论。您是否尝试将输入文件中基于条件值i在300-360和600-660之间输入的1/0输出到输出文件中。你能澄清一下吗?应该是

fputs(str[7], fop);

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:0)

fin = NULL和fop = NULL都应该使用'equal-equal'运算符。您将fin和fop设置为NULL,而不是检查错误的返回值。