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

时间:2017-01-09 12:32:56

标签: 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 *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比较陌生。我怎么能解决这个问题?

2 个答案:

答案 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已足够)并且预计不会调用以下内容