我正在以读/写模式创建文件并将字符串写入其中。然后我试图把它读入一个缓冲区,我得到读错误。
#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()系统调用创建的文件?
答案 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()
时,如果文件已存在,则会截断该文件。