作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试编写一个需要 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/
我是一名优秀的程序员,十分优秀!