使用 read()、write()、open() 将文件的内容复制到另一个文件

Posted

技术标签:

【中文标题】使用 read()、write()、open() 将文件的内容复制到另一个文件【英文标题】:Copying contents of a file to another using read(), write(), open() 【发布时间】:2012-02-09 21:28:09 【问题描述】:

我创建了一个快速程序来简单地抓取文件的内容并将它们转置到输出文件中。第一次运行我的程序时,我没有收到任何错误,而且看起来一切正常。但是,当我检查我的输出文件时,文件中没有任何内容。我的第一个想法是权限不正确,不允许写入。当我在目录中手动创建一个 .txt 文件并设置权限然后运行程序时它似乎可以工作(ubuntu 向我显示文件的内容,副本)但我无法打开实际文件。 希望比我有更多经验的人可以帮助我。 那么这是我的代码:

int main(int argc, char* argv[])
  char buf[128];
  int outft, inft,fileread;
  // output file opened or created
  if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR))==-1)
    perror("open");
  
  // lets open the input file
  inft = open(argv[2], O_RDONLY);
  if(inft >0) // there are things to read from the input
    fileread = read(inft, buf, 160);
    printf("%s\n", buf);
    write(outft, buf, 160);
    close(inft);
  
  close(outft);
  return 0;

【问题讨论】:

你是在将 160 字节读入一个 128 字节的缓冲区吗? 如果输入文件打开失败,则不报告。 read()write() 的返回值也未选中。 @paulsm4 关于权限也是正确的——在使用O_CREATopen() 时需要它们。如果我运行此代码(修复了缓冲区溢出),我会得到随机垃圾以获得新文件的文件权限。 【参考方案1】:

请务必也设置文件权限。

示例:

if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666))==-1)
    perror("open");
  

【讨论】:

【参考方案2】:

您的数据缓冲区大小为 128 字节,但您正在向其中读取 160 字节的数据。这意味着您正在写入声明缓冲区之外的内存。

我希望变量outft, inft, and fileread 可能在内存中跟随buf,并且在read() 调用期间被垃圾覆盖。对write() 的调用可能会失败,因为它正在获取要写入的文件描述符的垃圾值。

为了避免缓冲区溢出,sizeof 是你的朋友:

fileread = read(inft, buf, sizeof(buf));
...
write(outft, buf, fileread);

【讨论】:

是的,想通了,意识到这是多么愚蠢的错误。

以上是关于使用 read()、write()、open() 将文件的内容复制到另一个文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统函数open,read,write

Linux 执行partprobe命令时遇到Unable to open /dev/sr0 read-write (Read-only file system)

4. read()write() 相关函数解析

write之后为啥read不出来 为啥?

node中fs模块 - fs.open() fs.read() fs.write() fs.close()

Linux read/write fread/fwrite两者区别