gpt4 book ai didi

c - 如何将一个文件中每一行的特定数量的字符复制到另一个文件

转载 作者:行者123 更新时间:2023-11-30 15:02:31 25 4
gpt4 key购买 nike

所以我正在尝试编写一个需要 3 个命令行参数的程序,1. 现有文件的名称,2. 新文件的名称,3. 从每行复制到文件的字符数新文件。

这是我到目前为止所拥有的:

int main(int argc, char *argv[]) {

int size = atoi(argv[3]); // The number of characters to copy
char content[size];
char line[size];

FILE *f1 = fopen(argv[1], "r"); // Read from first file
FILE *f2 = fopen(argv[2], "w"); // Write to second file

if (f1 == NULL || f2 == NULL) {
printf("\nThere was an error reading the file.\n");
exit(1);
}

while (fgets(content, size, f1) != NULL) {
// This is what I had first:
fprintf(f2, "%s", content);

// And when that didn't work, I tried this:
strncpy(line, content, size);
fprintf(f2, "%s", line);
}

fclose(f1);
fclose(f2);
return 0;
}

提前致谢!

最佳答案

问题在于fgets 是如何工作的。它旨在读取下一行的末尾最大数量的size个字符,以先到者为准。如果它在读取换行符之前读取 size 个字符,则会返回该 size 长度的字符串,但会将该行的其余部分留在输入流中,以供读取通过下一个 fgets 调用!因此,如果 size 为 10,则循环仅读取 10 个字符 block 中的长行,但仍一次输出整行 10 个字符。

如果您想保留当前程序的结构,技巧是使用 fgets 读取整行(使用缓冲区和 size 值,即比最长的行长),删除换行符(如果存在),将该行截断为 n 个字符(例如,通过 NUL 终止它),然后打印出缩短的行。

这已经足够了,还是您只是想要一个有效的示例?

编辑:好的,这是一个可行的解决方案。

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

char line[4096];

int main(int argc, char *argv[]) {

int size = atoi(argv[3]); // The number of characters to copy

FILE *f1 = fopen(argv[1], "r"); // Read from first file
FILE *f2 = fopen(argv[2], "w"); // Write to second file

if (f1 == NULL || f2 == NULL) {
printf("\nThere was an error reading the file.\n");
exit(1);
}

// read whole line
// note: if the whole line doesn't fit in 4096 bytes,
// we'll be treating it as multiple 4096-byte lines
while (fgets(line, sizeof(line), f1) != NULL) {

// NUL-terminate at "size" bytes
// (no effect if already less than that)
line[size] = '\0';

// write up to newline or NUL terminator
for (char* p = line; *p && *p != '\n'; ++p) {
putc(*p, f2);
}
putc('\n', f2);

}

fclose(f1);
fclose(f2);
return 0;
}

关于c - 如何将一个文件中每一行的特定数量的字符复制到另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41009028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com