我读取了输入文件,该文件有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);
}
答案 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,而不是检查错误的返回值。