如何在C中正确使用读取功能?

时间:2015-10-23 08:27:51

标签: c linux file segmentation-fault

我想知道是否有人可以澄清一些关于Linux中read()功能的问题?目前,我不知道如何查看从read()命令返回的缓冲区。截至目前,它正在返回一个seg错误,当我可以运行它时,返回的值是我试图读取的文件中不存在的值。文本文件:测试测试。

因此,我没有获得testin(长度为6),而是获得了testin {。如果问题令人困惑,我很抱歉,如果您愿意,我会澄清更多。感谢您的所有时间和帮助!

        int main(int argc, char *argv[]){
            int fd = open("output_test.txt", O_RDWR | O_CREAT, 0666);
            char *buffer;
            char *copy;
            // printf("%lu\n", strlen(buffer));
            // write(fd, "testing", 7);    //this automatically writes to 
            printf("%zd\n", read(fd, &buffer, 6));
            printf("%lu\n", sizeof(buffer));
            copy = buffer;
            // printf("%lu\n", strlen(buffer));
            printf("%s\n", copy);
            }

2 个答案:

答案 0 :(得分:4)

  1. 您必须为缓冲区分配内存

    char *buffer =  malloc(10);
    
  2. 请检查open()

  3. 的返回情况
  4. read()接收void*。将代码更改为

    printf("%zd\n", read(fd, buffer, 6));
    
  5. 要获取字符串的长度,请使用strlen()而非sizeof()

  6. 作为奖励点,您的main()函数的类型为int,但您最终没有返回任何内容。

答案 1 :(得分:1)

读取已知大小的缓冲区并将其终止的正确方法:

 #define MYSIZE 6
 char buffer[MYSIZE+1];

 size_t sz = read(fd, buffer, MYSIZE);
 if (sz < 0) 
   { .... report error }
 else 
   buffer[sz] = '\0';

如果在编译时未知大小,则前两行将更改为

 char* buffer = malloc(MYSIZE+1);
 if (buffer == NULL)
   { ... report an error }

其余部分保持不变,您需要free(buffer)某处。