我正在尝试编写一个C程序,它使用标准I / O和系统调用来执行将一个文件的内容复制到另一个文件。
到目前为止,我已经这样做了:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd1, fd2;
char buffer[1024];
long int n1;
if(((fd1 = open(argv[1], O_RDONLY)) == -1) || ((fd2=open(argv[2],O_CREAT|O_WRONLY|O_TRUNC, 0700)) == -1)){
perror("file problem");
exit(1);
}
while((n1=read(fd1, buffer, 1024) > 0)){
if(write(fd2, buffer, n1) != n1){
perror("writing problem ");
exit(3);
}
}
close(fd1);
close(fd2);
}
当我运行这样的程序时:
cc copyContents.c
./a.out one.txt two.txt
假设one.txt
定义得很好,我想要的是创建一个名为two.txt
的新文件并复制one.txt
的所有内容
当我在运行程序后查看two.txt
的内容时,它几乎没有任何内容。只是一个空白文件。
我哪里错了?
答案 0 :(得分:4)
你写了
while((n1=read(fd1, buffer, 1024) > 0)){
而不是
while ( (n1 = read(fd1, buffer, 1024)) > 0)
在您的代码中,while
条件中的代码归结为:
n1 = (read(fd1, buffer, 1024) > 0)
因此,读取正确完成,将其返回值与0进行比较,将比较结果(0或1)分配给n1
。
这再次表明了以一种使其可读的方式格式化代码的重要性。
您可以使用调试器或在代码中插入一个或两个printf
来轻松调试。
答案 1 :(得分:1)
Narenda 检查循环内是否有 n==-1
,但是,循环测试是 n>0
,因此,这永远不会发生。
此外,应在尝试写入之前测试错误读取。
答案 2 :(得分:0)
输入:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
void typefile (char *filename)
{
int fd, nread;
char buf[1024];
fd = open (filename, O_RDONLY);
if (fd == -1) {
perror (filename);
return;
}
while ((nread = read (fd, buf, sizeof (buf))) > 0)
write (1, buf, nread);
close (fd);
}
int main (int argc, char **argv)
{
int argno;
for (argno = 1; argno < argc; argno )
typefile (argv[argno]);
exit (0);
}
输出:
student@ubuntu:~$gcc –o prg10.out prg10.c
student@ubuntu:~$cat > ff
hello`enter code here`
hai
student@ubuntu:~$./prg10.out ff
hello
hai
答案 3 :(得分:0)
这是最好的解决方案,易于执行。
输入:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int f1, f2;
char buff[50];
long int n;
if(((f1 = open(argv[1], O_RDONLY)) == -1 || ((f2=open(argv[2], O_CREAT |
O_WRONLY | O_TRUNC, 0700))== 1)))
{
perror("problem in file");
exit(1);
}
while((n=read(f1, buff, 50))>0)
if(write(f2, buff, n)!=n)
{
perror("problem in writing");
exit(3);
}
if(n==-1)
{
perror("problem in reading");
exit(2);
}
close(f2);
exit(0);
}
输出:
cc sys.c
./a.out a.txt b.txt
cat b.txt
因此,a.txt应该包含一些内容,并且此内容将被复制到b.txt 通过“ cat b.txt”,您可以交叉检查内容(在“ a.txt”中)。