我正在处理一个包含用空格分隔的整数的文本文件,例如:
1 2 57 99 8 14 22 36 98 445 1001 221 332 225 789 1111115 147 0 1 21321564 544 489 654 61266 5456 15 19
我想重新格式化这个文件,只包含最后一行中的5个整数,最后一行最多包含5个整数。
我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *f; // main file (A.txt)
FILE *g; // file copy (B.txt)
// open A.txt to read data
f = fopen("file/path/here/A.txt", "r");
if (f == NULL) {
printf("Read error.\n");
fclose(f);
return -1;
}
// open B.txt to write data
g = fopen("file/path/here/B.txt", "w");
if (g == NULL) {
printf("Write error.\n");
fclose(g);
return -2;
}
int line = 1; // first line in output file
while (!feof(f)) { // not end-of-file
char number[1000];
int i = 0;
for (i = 0; i <= 4; i++)
if (fscanf(f, "%s", number) == 1) { // one number read
fprintf(g, "%s", line + i, number);
}
line += i;
}
// close files
fclose(f);
fclose(g);
return 0;
}
当我在Code :: Blocks中运行它时,我得到'Segmentation fault(core dumped)Process returns 139'消息。我怀疑问题在于'if'语句和我对格式的使用。不用说,我对C比较陌生。我怎么能解决这个问题?
答案 0 :(得分:1)
您的分段错误的简单原因是表达式fprintf(g, "%s", line + i, number);
,其中您声明将指针传递给字符串(即char*
),但实际上传递了一个数字(即line + i
);因此,line + i
的值(可能是1
,...)被解释为指向内存地址1
的指针,不允许对其进行寻址。就好像你写了fprintf(g, "%s", 1)
,它也崩溃了;
因此基本上将此表达式更改为fprintf(g, "%s", number);
,并且至少应该不会崩溃(除非您的数字超过999位)。
您的代码中还存在其他一些问题,例如:您打开B.txt
进行写入并将其分配给g
,然后使用变量f
测试并关闭该文件。
但也许上面的“崩溃解决方案”会让你前进,这样你就可以自己进一步工作了。请注意 - 如果B.txt
打开失败,那么由于将NULL
作为文件流参数传递给fprintf
,您的代码也会崩溃。
答案 1 :(得分:-1)
问题在于使用fscanf
然后fprintf
。
fscanf
知道如何将字符串解析为数字。例如。 fscanf(f, "%d", &var);
。这会将文件句柄f
中的有符号整数读入变量var
。然后可以使用fprintf
打印。
按照目前的情况,第一个fscanf
将整个输入投入number
(假设1000 char
已足够)并且预计不会调用以下内容