C 将文件格式化为每行有5个数字

C 将文件格式化为每行有5个数字,c,text-files,C,Text Files,我正在处理一个包含由空格分隔的整数的文本文件,例如: 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

我正在处理一个包含由空格分隔的整数的文本文件,例如:

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;
}
#包括
#包括
int main()
{
FILE*f;//主文件(A.txt)
FILE*g;//文件副本(B.txt)
//打开A.txt以读取数据
f=fopen(“文件/path/here/A.txt”、“r”);
如果(f==NULL){
printf(“读取错误。\n”);
fclose(f);
返回-1;
}
//打开B.txt以写入数据
g=fopen(“文件/path/here/B.txt”,“w”);
如果(g==NULL){
printf(“写入错误。\n”);
fclose(g);
返回-2;
}
int line=1;//输出文件中的第一行
而(!feof(f)){//不是文件的结尾
字符数[1000];
int i=0;

对于(i=0;i问题在于使用
fscanf
,然后使用
fprintf

fscanf
知道如何将字符串解析为数字。例如,
fscanf(f,“%d”和&var)
。这将从文件句柄
f
读取有符号整数到变量
var
。然后可以使用
fprintf
打印


目前为止,第一个
fscanf
将整个输入值拖到
number
中(假设1000
char
就足够了),下面的字符预计不会被调用分段错误的简单原因是expression
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

请参见。不要
fclose(f)
如果
f
NULL
。请使用您的调试器,它会告诉您SEGFULT发生的确切位置。
fprintf(g,“%s”,line+i,number);
fprintf(g,“%s”,number);
line+=i;
行+=1;fprintf(g,“\n”)