read() 和 (C Linux) 中的缓冲区大小错误



//EDIT:我将第一个句柄的标志设置为 O_WRONLY,它应该是O_RDONLY的,这导致了问题。

我正在使用 C 在 Linux 中开发一个简单的程序,该程序可以将文本从一个文件复制到另一个文件。

#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
...
int main(int argc, char * argv[])
{
    int cp_from = open(argv[1],O_WRONLY);
    int cp_to = open(argv[2],O_WRONLY|O_CREAT,0777);    //make a descriptor for each file
    int size = lseek(cp_from,0,SEEK_END);               //check the size of the first file
    lseek(cp_from,0,SEEK_SET)                           //return to the start of the file, don't know if that's needed
    char *buf = (char*) malloc (size*sizeof(char));     //allocate enough memory to fit all text from 1st file into char array
    read(cp_from,buf,sizeof(buf)-1);                    //read from the 1st file to the char array
    printf("%s",buf);                                   //print the buf
    close(cp_from);
    close(cp_to);
...

所以,稍后我会将()"buf"写成"cp_to",这将(希望)起作用。但是,这里只有一半的工作,因为它在这一点上停止工作,"buf"是空的,我不知道为什么。有什么想法吗?

以下是一些评论点:

  1. 不要在 C 中强制转换 malloc() 的返回值。
  2. 不要在堆指针上使用 sizeof,认为它会返回与分配的缓冲区大小有关的任何内容;它不会。您将获得指针的大小。
  3. 使用正确的类型,而不仅仅是对所有内容int。类型很重要,并非所有类型都像int.
  4. 不要将从文件中读取的随机数据视为字符串。
  5. 不要执行 I/O,也不检查返回值。I/O 可能会失败。
  6. 。内存分配也是如此。

最好使用小型(或小型)固定大小的缓冲区,并在循环中读/写。这样,无论文件的大小如何,程序都会使用有限的内存量。

以下代码:

  1. 仍然有关于未使用的变量argc的警告(见评论)
  2. 缺少用于检查系统函数调用返回的错误指示的代码
  3. 实际有效

现在的代码

//#include <sys/types.h>
//#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
    int cp_from = open(argv[1], O_RDONLY);
    int cp_to = open(argv[2], O_WRONLY|O_CREAT,0777);
       //make a descriptor for each file

    size_t size = (size_t)lseek(cp_from,0,SEEK_END);               //check the size of the first file
    lseek(cp_from,0,SEEK_SET);
    //return to the start of the file, don't know if that's needed
    char *buf = malloc (size);     //allocate enough memory to fit all text from 1st file into char array
    read( cp_from, buf, size );                    //read from the 1st file to the char array
    write( cp_to, buf, size );                                   //print the buf
    close(cp_from);
    close(cp_to);
}

相关内容

  • 没有找到相关文章

最新更新