从备用文件逐行打印到c中的第三个文件

时间:2016-11-18 21:59:37

标签: c file

对于作业,我必须逐行将文本从2个文件输入到第3个文件中。因此,文件1第1行将是文件3第1行,文件2第3行将是文件3第2行。我已经尝试过此但似乎无法从每个文件中获取备用的行。我只能分别从每个文件中获取行。请帮助提出任何建议。

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

int main(int argc, char *argv[])
{
    FILE *file1, *file2, *file3;
    char line [1000]; /* or other suitable maximum line size */

    // check to make sure that all the file names are entered
    if (argc != 4) {
        perror("Error: ");
        printf("Not enough files were entered!\n");
        exit(0);
    }

    file1 = fopen(argv[1],"r");;
    file2 = fopen(argv[2],"r");
    file3 = fopen(argv[3],"w");

    // check whether the file has been opened successfully
    if (file1 == NULL)
    {
        perror("Error: ");
        printf("Cannot open file1 %s!\n", argv[1]);
        exit(-1);
    }
    // check whether the file has been opened successfully
    if (file2 == NULL)
    {
        perror("Error: ");
        printf("Cannot open file2 %s!\n", argv[2]);
        exit(0);
    }
    // check whether the file has been opened successfully
    if (file3 == NULL)
    {
        perror("Error: ");
        printf("Cannot open file3 %s!\n", argv[3]);
        exit(0);
    }
    int count = 0;
    while (1) 
    {
            if(fgets(line, sizeof line, file1) != NULL)
            {
                count+=1;
                fprintf(file3, line);
            }
            else
            {
                break;
            }

            if(fgets(line, sizeof line, file2) != NULL)
            {
                count++;
                fprintf(file3, line);
            }
            else
            {
                break;
            }
    }

    fclose (file1);
    fclose (file2);
    fclose (file3);
}

1 个答案:

答案 0 :(得分:0)

fprintf(FILE *, const char *format, ...)期望格式作为第二个参数。

如果遇到fprintf(file3, line);,使用line'%'包含%或至少缺少"%%"时,将调用未定义的行为(UB)。

使用fputs()

// fprintf(file3, line);
fputs(line, file3);

高级编码的其他问题:

如果源文件包含空字符,则使用fgets()是不够的,因为它不报告读取的长度。其他方法包括使用fgetc()fread()或非标准C getline()

如果输入文件没有以'\n'结尾,则该rump行可能看起来像是从另一个文件读取的行的预先修复。

正如OP所指出的,大约1000+的线路长度是个问题。

源文件的行尾,如果它们与代码不匹配,对行结尾的理解可能会导致问题。