【问题标题】:fgetc() adds carriage return to line feedfgetc() 将回车添加到换行符
【发布时间】:2021-02-06 12:22:08
【问题描述】:

我正在尝试制作一个将多个文件连接到一个的程序。我目前拥有的代码如下:

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

void main(int n, char** args) {
    if (n < 2) printf("Too few arguments. Format: <output> [files...]");

    FILE* output = fopen(args[1], "w");

    for (int i = 2; i < n; i++) {
        FILE* curr = fopen(args[i], "rb");

        while (!feof(curr)) {
            int c = fgetc(curr);

            fputc(c, output);
        }

        fclose(curr);
    }

    fclose(output);
}

但是,当我在文件中有 \n 时,fgetc 在新文件中的 \n 后面添加 \r。我尝试将文件作为二进制文件打开,但它仍然在所有 \n-s 后面添加了额外的 \r。

如何摆脱这个功能?

【问题讨论】:

  • fopen(..., "r") 删除文本模式(而不是二进制模式)的"b"
  • stackoverflow.com/a/28462221/4756299 可以在这里工作这很可能是这个问题的欺骗......
  • @pmg 但如果这是在 POSIX 系统上,文本模式将无济于事。
  • while (!feof(curr)) {...} stackoverflow.com/questions/5431941/…
  • 标题是fgets(),但代码是fgetc()。真正的目标是什么?

标签: c file fgetc


【解决方案1】:

由于您以二进制模式 ("rb") 打开输入文件,您将获得 CR/LF 行尾序列作为单独的字节 '\r''\n',它们作为序列存储到输出文件中CR/CR/LF 在旧系统上的影响,因为以文本模式打开的输出文件会将'\n' 转换为 CR/LF,并将'\r' 原封不动地存储为 CR。

同样以二进制模式打开输出文件,使用"wb"

还修复了一些其他问题,如下所示:

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

int main(int argc, char **argv) {
    if (argc < 2) {
        fprintf(stderr, "Missing arguments. Format: <output> [files...]\n");
        return 2;
    }

    FILE *output = fopen(argv[1], "wb");
    if (output == NULL) {
        fprintf(stderr, "Cannot open output file '%s': %s\n",
                argv[1], strerror(errno));
        return 1;
    }

    for (int i = 2; i < argc; i++) {
        int c;
        FILE *curr = fopen(argv[i], "rb");
        if (curr == NULL) {
            fprintf(stderr, "Cannot open input file '%s': %s\n",
                    argv[i], strerror(errno));
            continue;
        }
        while ((c = fgetc(curr)) != EOF) {
            fputc(c, output);
        }
        fclose(curr);
    }

    fclose(output);
    return 0;
}

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多