linux下c语言编程read()函数的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下c语言编程read()函数的问题相关的知识,希望对你有一定的参考价值。
read返回始终是-1。。。求解是为什么
返回-1的时候,要根据错误码来判断原因,请看下面的函数说明:表头文件 #include<unistd.h>
定义函数 ssize_t read(int fd,void * buf ,size_t count);
函数说明 read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
附加说明 如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。
错误代码 EINTR 此调用被信号所中断。 EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。 EBADF 参数fd 非有效的文件描述词,或该文件已关闭。 参考技术A On error, -1 is returned, and errno is set appropriately.
读出错了
http://linux.die.net/man/2/read 参考技术B 调用perror看原因 参考技术C 源码贴出来。也好看看嘛,不然别人都没办法知道你什么出错了 参考技术D man read, 看看文档怎么说阿
C语言-文件编程
1. 文件编程函数介绍
如果在Linux系统下学习C语言,就会了解到两套文件编程接口函数:
C语言标准的文件编程函数: fopen*、fread、fwrite、*fclose
Linux下提供的文件编程函数: open*、read、write、*close
传参的区别:
基于文件指针: fopen fclose fread fwrite 比较适合操作普通文件。
基于文件描述符: open close read write 比较适合操作设备文件。
2. C语言标准库提供的文件编程函数
下面介绍C语言标准库提供的文件编程函数,一般对文件常用的操作就是:创建(打开)、读、写、关闭。
其他的函数用法同理,只要把这4个函数学会了,基本的文件操作已经可以完成了。
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
函数功能: 打开或者创建文件
函数参数:
const char *path 填文件的路径
const char *mode 填权限。比如: wb rb a+b
函数返回值: 文件打开或者创建成功返回对应的文件指针.
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能: 读文件
函数参数:
void *ptr :读取数据存放的缓冲区。
size_t size :每次读取的大小
size_t nmemb :每次读取的次数
FILE *stream :读取文件
返回值: 读取成功的次数。
比如: fread(buff,1,1000,fp); 从fp文件里读取1000个字节的数据到buff里。
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
函数功能: 写文件
函数参数:
void *ptr :将要写入的数据缓冲区首地址。
size_t size :每次写入的大小
size_t nmemb :每次写入的次数
FILE *stream :写入的文件
返回值: 写入成功的次数。
比如: fwrite(buff,1,1000,fp); 向fp文件里写1000个字节的数据,数据从buff里获取。
int fclose(FILE *fp);
函数功能: 关闭打开的文件。
3. Linux下的系统函数: 文件编程函数
Linux下也有一套系统函数,用于文件操作,这些函数在Linux下常用于读写设备文件;当然,读写普通文件也是一样,普通文件也是磁盘上的数据,也是操作块设备驱动。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
函数功能: 打开或者创建文件
函数参数:
const char *pathname : 文件的路径
int flags :打开文件的权限.
比如: O_RDONLY O_WRONLY O_RDWR O_CREAT
mode_t mode :创建文件时指定文件本身的权限.
比如:
S_IRWXU 00700 user (file owner) has read, write and execute permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
返回值: (返回文件描述符--小整数)文件打开成功值>=0 否则<0
示例: open("123.c",O_RDWR|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
创建一个123.c的新文件,并且指定该文件的权限是最高权限. chmod 777 123.c一样
ssize_t read(int fd, void *buf, size_t count);
函数功能: 读文件
函数参数:
int fd :文件描述符. ---表示已经打开的文件。
void *buf :读取数据存放的缓冲区.
size_t count :读取字节数量.
返回值: 成功读取的字节数量.
ssize_t write(int fd, const void *buf, size_t count);
函数功能: 写文件
函数参数:
int fd :文件描述符. ---表示已经打开的文件。
void *buf :将要写入到文件的数缓冲区首地址.
size_t count :写入的字节数量.
返回值: 成功写入的字节数量.
int close(int fd);
函数功能: 关闭已经打开的文件.
4. 案例: 实现文件拷贝功能(fopen)
例如: cp 123.c 456.c 将123.c的数据拷贝到456.c文件里。
注意: 下面这个代码需要在命令行上运行,需要给main函数传参。如果是在windows下IED软件里运行,可以将传参代码屏蔽掉,改成让用户输入,或者直接把参数固定也可以。
#include <stdio.h>
//实现: cp 123.c 456.c
int main(int argc,char **argv)
if(argc!=3)
printf("参数: ./a.out <源文件> <目标文件>\\n");
return 0;
/*1. 打开源文件*/
FILE *src_fp=fopen(argv[1],"rb");
if(src_fp==NULL)
printf("%s 文件打开失败.\\n",argv[1]);
return -1;
/*2. 创建新文件*/
FILE *new_fp=fopen(argv[2],"wb");
if(new_fp==NULL)
printf("%s 文件创建失败.\\n",argv[2]);
fclose(src_fp);
return -2;
/*3. 实现文件的拷贝*/
unsigned char buff[1024];
unsigned int cnt;
while(1)
cnt=fread(buff,1,1024,src_fp);
fwrite(buff,1,cnt,new_fp);
if(cnt!=1024)break;
/*4. 关闭文件*/
fclose(new_fp);
fclose(src_fp);
return 0;
5. 案例: 实现文件拷贝功能(open)
例如: cp 123.c 456.c 将123.c的数据拷贝到456.c文件里。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//实现: cp 123.c 456.c
int main(int argc,char **argv)
if(argc!=3)
printf("参数: ./a.out <源文件> <目标文件>\\n");
return 0;
/*1. 打开源文件*/
int fd_src=open(argv[1],O_RDONLY);
if(fd_src<0)
printf("源文件打开失败.\\n");
return -1;
/*2. 创建新文件*/
int fd_new=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(fd_new<0)
printf("新文件创建失败.\\n");
close(fd_src);
return -2;
/*3. 拷贝文件*/
unsigned char buff[1024];
int cnt;
while(1)
cnt=read(fd_src,buff,1024);
write(fd_new,buff,cnt);
if(cnt!=1024)break;
/*4. 关闭文件*/
close(fd_src);
close(fd_new);
return 0;
以上是关于linux下c语言编程read()函数的问题的主要内容,如果未能解决你的问题,请参考以下文章