自学内容网 自学内容网

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)!