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
中(假设1000char
就足够了),下面的字符预计不会被调用分段错误的简单原因是expressionfprintf(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”)