创建系统调用后读取文件时出错

时间:2014-09-18 10:36:45

标签: c linux

我正在以读/写模式创建文件并将字符串写入其中。然后我试图把它读入一个缓冲区,我得到读错误。


#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main()
{
    int fd,count,fd1;
    char buf[10];
    fd=creat("./smarak",S_IRWXU);
    if(fd<0)
    {
        perror("creat");
    }
    count=write(fd,"Hello smarak",7);
    printf("count=%d\n",count);
    count=read(fd,buf,7);
    printf("buf=%s\n",buf);
    printf("%d\n",count);
}

我在buf中得不到任何东西,而count也是-1,这是读错误。为什么这个错误?是不是可以读取由creat()系统调用创建的文件?

2 个答案:

答案 0 :(得分:3)

你需要在写作和阅读之间重新定位:

 count=write(fd,"Hello smarak",7);
 printf("count=%d\n",count);

 // added:
 if ( lseek( fd, 0, SEEK_SET ) < 0 )
 {
     perror("lseek");
 }

 count=read(fd,buf,7);
 printf("buf=%s\n",buf);
 printf("%d\n",count);

写完后,文件中的当前位置就在你写完之后。如果你想重读,你必须回复&#34;当前位置到文件的开头。

查看man lseek了解详情。

我不知道Unix调用如何处理这个问题,但是C标准(C99,7.19.5.3 fopen函数,第6节)有这样的说法:

  

[...]输出不得直接输入没有a   干预调用fflush功能或文件定位   功能(fseek,fsetpos或倒带),输入不能直接输入   然后是输出而没有对文件定位的干预调用   函数,除非输入操作遇到文件结尾。

因此,可能正在查看代码示例中的未定义行为。

答案 1 :(得分:0)

使用lseek()函数将位置设置为指定的位置。

尝试使用open()系统调用而不是creat()系统调用。

当您使用creat()时,它将以

打开该过程
root@Lenovo-G585:/proc/6988/fd$ ls -la
total 0
dr-x------ 2 root root  0 Sep 18 16:20 .
dr-xr-xr-x 8 root root  0 Sep 18 16:20 ..
lrwx------ 1 root root 64 Sep 18 16:20 0 -> /dev/pts/4
lrwx------ 1 root root 64 Sep 18 16:20 1 -> /dev/pts/4
lrwx------ 1 root root 64 Sep 18 16:20 2 -> /dev/pts/4
l-wx------ 1 root root 64 Sep 18 16:20 3 -> /tmp/smarak
 ^ 

看看这里。

缺少读取权限,因此您无法从该文件中读取。 如果您使用open()系统调用,如

fd=open("./smarak",O_CREAT|O_RDWR);

O_CREAT - Which is used to create a new file if doesn't exist.
O_RDWR  - Which is used to open a file for read and write mode.

通过使用给定参数的open,您可以满足您的要求。 使用creat()时,它将在O_CREAT | O_WRONLY | O_TRUNC中打开文件。

O_TRUNC - Which is used to truncate remove the file content and keep 
          the cursor position in start of file.

注意:使用creat()时,如果文件已存在,则会截断该文件。