我正在尝试创建一个函数,它接受一系列文件并将每个文件的内容写入一个新文件。
#include <stdio.h>
#include <stdlib.h>
void file_copy(FILE *f1, FILE *f2) {
char buffer[BUFFER_SIZE];
size_t sz;
sz = fread(buffer, sizeof(buffer),1,f1);
while (sz == 1) {
fwrite(buffer, sz,1,f2);
sz = fread(buffer, sizeof(buffer),1,f1);
}
}
int main(int argc, char const *argv[])
{
FILE *f_in, *f_out;
int i;
if (argc < 3)
{
puts("Not enough arguments.");
exit(1);
}
if ((f_out = fopen(argv[argc-1], "w")) == NULL)
{
printf("Can't open %s for writing.\n", argv[argc-1]);
exit(1);
}
for (i = 0; i < argc-1; ++i)
{
if ((f_in = fopen(*++argv, "r")) == NULL)
{
printf("Can't open %s for reading\n", *argv);
exit(1);
}
else
file_copy(f_in, f_out);
close(f_in);
close(f_out);
}
return 0;
}
我不会在输出文件中输出任何内容。 它似乎正好关闭它们。
答案 0 :(得分:1)
有几个失败:
write
必须写入读取的字节数,而不是完整的缓冲区所以它应该是这样的:
#define BUF_SIZE 1024
void file_copy(FILE *f1, FILE *f2) {
char buffer[BUF_SIZE];
while (!feof(f1)) {
size_t r = fread(buffer, 1, sizeof(buffer), f1);
fwrite(buffer, 1, r, f2);
}
}
答案 1 :(得分:1)
您打算从最后一个文件中的文件列表中保存文本吗?它并不是很清楚。
除了不可读的语法之外,代码还存在多个问题。您应该使用fclose
而不是close
。并且读取一个字节元素而不是一个巨大数组的一个元素。
这是固定代码:
#include <stdio.h>
#include <stdlib.h>
void file_copy(FILE *f1, FILE *f2) {
char buffer[1024];
ssize_t sz;
while (!feof(f1)) {
sz = fread(buffer, 1, sizeof(buffer), f1);
fwrite(buffer, 1, sz, f2);
}
}
int main(int argc, char const *argv[])
{
FILE *f_in, *f_out;
int i;
if (argc < 3)
{
puts("Not enough arguments.");
exit(1);
}
if ((f_out = fopen(argv[argc-1], "w")) == NULL)
{
printf("Can't open %s for writing.\n", argv[argc-1]);
exit(1);
}
for (i = 1; i < argc-1; i++)
{
if ((f_in = fopen(argv[i], "r")) == NULL)
{
printf("Can't open %s for reading\n", *argv);
exit(1);
}
else
{
file_copy(f_in, f_out);
fclose(f_in);
}
}
fclose(f_out);
return 0;
}
答案 2 :(得分:0)
你应该知道要写多少,因为你现在最终写的是1024字节,就像现在一样。
根据您正在处理的文件类型,这至少是txt文件的一个选项:
void file_copy(FILE *f1, FILE *f2) {
fseek(f1, 0, SEEK_END);
int buf_size = ftell(f1);
char buf[buf_size];
//Reset file position
fseek(f1, 0, SEEK_SET);
sz = fread(buf, sizeof(buf), 1, f1);
fwrite(buf, sz, 1, f2);
}