Linux C/C++编程-文件的读取与写入示例
【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客
《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 LinuxC\C++编程技术_夏天又到了的博客-CSDN博客
4.8.5 读取文件中的数据
可以用函数read从已打开的文件中读取数据,该函数声明如下:
#include <unistd.h>
ssize_t read(int fd,void * buf ,size_t count);
该函数会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件末尾或没有可读取的数据,注意:文件读写位置会随读取到的字节移动。
需要强调的是,如果函数读取成功,会返回实际读到的数据的字节数,最好能将返回值与参数count做比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件末尾或者read()被信号中断了读取动作。当有错误发生时,则返回-1,错误代码存入errno中,此时文件读写位置无法预料。
常见的错误代码如下:
- EINTR:此调用被信号中断。
- EAGAIN:当使用不可阻断I/O时(O_NONBLOCK),若无数据可读取,则返回此值。
- EBADF:参数fd为非有效的文件描述符,或当前文件已关闭。
【例4.5】从文件中读取数据
(1)打开Visual Studio Code,新建一个test.cpp文件,在test.cpp中输入如下代码:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(void)
{
int fd = -1,i;
ssize_t size =-1;
char buf[10];
char filename[] = "/root/test.txt"; // 要读取的文件
fd = open(filename,O_RDONLY); // 只读方式打开文件
if(-1==fd)
{
printf("Open file %s failuer,fd:%d\n",filename,fd);
return -1;
}
else printf("Open file %s success,fd:%d\n",filename,fd);
// 循环读取数据,直到文件末尾或者出错
while(size)
{
// 读取文件中的数据,10的意思是希望读10个字节,但真正读到的字节数是函数返回值
size = read(fd,buf,10);
if(-1==size)
{
close(fd);
printf("Read file %s error occurs\n",filename);
return -1;
}else{
if(size>0)
{
printf("read %d bytes:",size);
printf("\"");
for(i =0;i<size;i++) // 循环打印文件读到的内容
printf("%c",*(buf+i));
printf("\"\n");
}else{
printf("reach the end of file \n");
}
}
}
return 0;
}
(2)上传test.cpp到Linux,在终端下输入命令g++ -o test test.cpp,然后运行test,运行结果如下:
[root@localhost cpp98]# g++ -o test test.cpp
[root@localhost cpp98]# ./test
Open file /root/test.txt success,fd:3
read 3 bytes:"abc"
reach the end of file
我们可以在/root下放一个文本文件test.txt,然后输入3个字符“abc”,这样程序就能正确打开test.txt并读出文件的内容了。
4.8.6 向文件写入数据
可以用函数write将数据写入已打开的文件内,该函数声明如下:
#include <unistd.h>
ssize_t write (int fd,const void * buf,size_t count);
该函数会把参数buf所指的缓冲区中的count个字节数据写入fd所指的文件内。当然,文件读写位置也会随之移动。其中,参数fd是一个已经打开的文件描述符;buf指向一个缓冲区,表示要写的数据;count表示要写的数据的长度,单位是字节。如果函数执行成功,就返回实际写入数据的字节数。当有错误发生时,则返回-1,错误代码可以用errno查看。常见的错误代码如下:
- EINTR此调用被信号所中断。
- EADF参数fd是非有效的文件描述符,或该文件已关闭。
【例4.6】向文件中写入文件
(1)打开Visual Studio Code,新建一个test.cpp文件,在test.cpp中输入如下代码:
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main(void)
{
int fd = -1,i;
ssize_t size =-1;
int input =0;
char buf[] = "boys and girls\n hi,children!"; // 要写入文件的字符串
char filename[] = "test.txt";
fd = open(filename,O_RDWR|O_APPEND); // 以追加和读写方式打开一个文件
if(-1==fd)
{
printf("Open file %s faliluer \n",filename );
}else{
printf("Open file %s success \n,=",filename );
}
size = write(fd,buf,strlen(buf)); // 向文件中写入数据,实际写入数据由函数返回并存入size中
printf("write %d bytes to file %s\n",size,filename);
close(fd);
return 0;
}
(2)上传test.cpp到Linux,在终端下输入命令g++ -o test test.cpp,然后运行test,运行结果如下:
[root@localhost cpp98]# g++ -o test test.cpp
[root@localhost cpp98]# ./test
Open file /root/test.txt success
write 28 bytes to file /root/test.txt
我们可以在/root下放一个文件test.txt,并预先写入几个字符,比如abc,然后运行该程序,运行完毕后再打开文件,可以看到abc后面追加了我们通过程序添加的内容,比如:
[root@localhost cpp98]# cat /root/test.txt
abcboys and girls
hi,children!boys and girls
原文地址:https://blog.csdn.net/brucexia/article/details/145225636
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!