[英]fgetc() adds carriage return to line feed
我正在嘗試制作一個將多個文件連接到一個的程序。 我目前擁有的代碼如下:
#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 。 我嘗試將文件作為二進制文件打開,但它仍然在所有 \ns 后面添加了額外的 \r。
如何擺脫此功能?
由於您以二進制模式 ( "rb"
) 打開輸入文件,因此您將 CR/LF 行尾序列作為單獨的字節'\r'
和'\n'
存儲到 output 文件中作為序列舊系統上的 CR/CR/LF,因為在文本模式下打開的 output 文件將'\n'
轉換為 CR/LF 並將'\r'
存儲為 CR。
只需使用"wb"
以二進制模式打開 output 文件。
還修復一些其他問題,如下所示:
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.