C文件处理:文本不附加在文件的末尾

时间:2012-07-28 05:51:34

标签: c file-handling

程序应查看file1的每一行,然后查看file2中是否存在完全相同的行。如果是,则将该行复制到名为output的新文件。

说,以下是文件的内容(可能是句子,但为了简单起见,我已经放了数字。) -

  file1              file2
    1                 2
    2                 4
    3                 15
    4                 6
    5                 11
    6                 8
    7
    8
    9

然后output文件应该看起来像 -

 (Expected) output
              2
              4
              6
              8

在shell中我可以看到printf按预期打印output,但是fprintf反转了顺序,我不明白为什么?打印到输出文件的输出是 -

 output
    8
    6
    4
    2

这是代码 -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE *file1, *file2, *output;
    int c;

    /*Creating buffers where data will be stored for comparison*/   
    char buffer1[999], buffer2[999];

    /*Settig the buffer characters array to 0*/
    memset(buffer1, 0, sizeof(buffer1));
    memset(buffer2, 0, sizeof(buffer2));

    /*Open output file in "w" so that it clears the file*/
    output = fopen("output", "w");
    /*Open file1 and then save the line inside buffer1 (within while loop)*/
    file1 = fopen("file1", "r");
    /*Read each character in file until End Of Line*/
    while((c = getc(file1)) != EOF)
    {
        int i = 0;
        /*Save each new line of file1 in buffer1 for comparison*/
        while(c != '\n')
        {
            buffer1[i++] = c;
            c = getc(file1);
        }

        /*Open file2 and then save it's line in buffer2 (withing while loop)*/      
        file2 = fopen("file2", "r");
        int ch;

        while((ch = getc(file2)) != EOF)
        {
            i = 0;
            while(ch != '\n')
            {
                buffer2[i++] = ch;
                ch = getc(file2);
            }

            /*Compare lines of file1 against each line of file2*/
            if(strcmp(buffer1,buffer2) == 0)
            {
                /*Save similar lines in a file named output*/
                output = fopen("output", "a");
                fprintf(output,"%s\n", buffer2);
                printf("%s\n", buffer2);
                break;
            }
            /*Reset the buffer*/
            memset(buffer2, 0, sizeof(buffer2));
        }

        memset(buffer1, 0, sizeof(buffer1));
    }

    /*Close the output file if there were any comparison made i.e. if file was opened*/
    if(output != NULL)
    {
        fclose(output);
    }

    /*Close other files*/
    fclose(file1);
    fclose(file2);

    return 0;
}

1 个答案:

答案 0 :(得分:4)

打开 output 每个差异并在结束时关闭一次这是错误的,可能会导致你问题。尝试打开output一次,也许在循环之前。如果您没有发现任何差异,可以将其删除,以避免空文件。