当前位置: 代码迷 >> 综合 >> Linux5:文件操作(标准I/O文件I/O):打开,创建,读写操作,标准I/O和文件I/O的区别
  详细解决方案

Linux5:文件操作(标准I/O文件I/O):打开,创建,读写操作,标准I/O和文件I/O的区别

热度:29   发布时间:2024-02-26 11:20:21.0

文件操作(标准I/O文件I/O):打开,创建,读写操作,标准I/O和文件I/O的区别

Linux系统下一切皆文件。
在这里插入图片描述

1.标准I/O(缓冲区文件操作)

接口

类型 ANSI C标准文件操作管理

文件描述:

认识缓冲区

一块内存区,在输入输出设备和CPU间,用来缓存数据。

读写操作都要经过缓冲区满足一定条件(遇到’\n’通过相关函数)后进行真正的写入和读出标准输入/输出流:

程序开始运行时,会有3个默认打开的文件标识符0:标准输入:stdin:STDIN_FILENO系统分配为键盘1:标准输出:stdout:   STDOUT_FILENO系统分配为显示器2:标准错误:stderr:    STERROR_FILONO系统分配为显示器fflush()//清理缓冲区的函数fflush(stdin)ffush(stdout)

FILE指针
定义
系统为打开文件建立的文件结构体,打开时返回来一个指针,程序通过指针获得文件信息,访问文件,关闭后,文件结构体被释放

ANSI c描述一个打开的文件,定义stdio.h形式struct _iobuf{
    char *_ptr;//当前缓冲区内容指针int   _cnt;//缓冲区还有多少个字符char *_base;//缓冲区的起始地址int   _flag;//文件流的状态,是否错误或者结束int   _file;//文件描述符int   _charbuf;//双字节缓冲,缓冲2个字节int   _bufsiz;//缓冲区大小char *_tmpfname;//临时文件名
};
typedef struct _iobuf FILE;

打开关闭
API

  fopen原型FILE * fopen(const char * path,const char * mode);功能打开由path指定的一个文件头文件#include<stdio.h>参数path:带路径的文件名mode打开方式r打开只读文件,该文件必须存在r+打开可读写的文件,该文件必须存在w打开只写文件,若文件存在则文件长度清为0,即会擦些文件以
前内容。若文件不存在则建立该文件。w+打开可读写文件,若文件存在则文件长度清为0,即会擦些文件
以前内容。若文件不存在则建立该文件。a以附加的方式打开只写文件。若文件不存在,则会建立该文件,
如果文件存在,写入的数据会被加到文件尾,即文件原先的内容
会被保留。a+以附加方式打开可读写的文件。若文件不存在,则会建立该文
件,如果文件存在,写入的数据会被加到文件尾后,即文件原先
的内容会被保留。返回值成功,返回操作文件的指针
失败,返回NULLfclose原型int fclose(FILE *fp)功能关闭文件指针,释放资源参数fp: fopen返回的文件指针返回值成功返回    0
失败返回    -1

注意事项:
有没有这个文件
你要进行的操作

代码演示:

#include <stdio.h>
int main(int argc,char *argv[])
{
    FILE *fp=NULL;fp = fopen("hello.txt","r");if(fp == NULL){
    perror("fopen");//打印错误原因return -1;}printf("打开文件成功\n");fclose(fp);return 0;
}  

单个字符读写
API

  fputc原型int fputc(int c, FILE *stream)头文件#include <stdio.h>功能写一个字符到文件中参数c:要写入的字符stream:文件指针(要有可写权限)返回值成功:字符c失败: EOFfgetc原型int fgetc(FILE *stream);头文件#include <stdio.h>功能从文件中读一个字符返回值成功:返回读出的字符失败: EOFfeof原型int feof(FILE *stream);头文件include <stdio.h>功能检查文件是否读取结束参数stream:指向待检查文件的指针返回值文件未结束: 0   文件已结束: 1

代码演示:

#include <stdio.h>
int main(int argc,char *argv[])
{
    FILE *fp=NULL;char ch;fp = fopen("hello.txt","w+");if(fp == NULL){
    perror("fopen");return -1;}printf("打开文件成功\n");while(ch != '#'){
    fputc(ch,fp);ch = getchar();}fclose(fp);fp = fopen("hello.txt","r");if(fp == NULL){
    perror("fopen");return -1;}printf("打开文件成功\n");ch = fgetc(fp);while(!feof(fp)){
    putchar(ch);ch = fgetc(fp);}fclose(fp);return 0;
} 

字符串读写

fgets原型char * fgets(char * s, int size, FILE * fp);头文件#include <stdio.h>功能从fp指向的文件中读出一行(最多size-1个字符) 直到出现换行字符、读到文件尾或是已读了size-1 个字符为止,写入s指向的缓冲区。参数s  保存读取到的字符size  要读取的字符的个数fp  为文件流指针返回值取成功,返回读取到的字符串,失败NULLfputs原型int fputs(const char *s, FILE *fp)功能:将字符串s写入fp指向的文件中s:   要写入文件的缓冲区指针fp:要写入的目标文件的流指针

代码演示:

#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
    FILE *fp=NULL;char w_buf[12] = "hello world";char r_buf[12];memset(r_buf,0,sizeof(r_buf));fp = fopen("hello.txt","w");if(fp == NULL){
    perror("fopen");return -1;}printf("打开文件成功\n");fputs(w_buf,fp);rewind(fp);fgets(r_buf,12,fp);printf("r_buf:%s\n",r_buf);fclose(fp);return 0;
}

块读块写:

fread原型size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);头文件#include <stdio.h>功能读文件参数ptr: 要读入的缓冲区指针, 提前申请好的size: 要读出的信息单元的大小  一般情况下, size设为1nmemb:要读出的信息单元的个数, size* nmemb不大于ptr大小fp:   要读的文件指针, 提前用fopen打开的返回值成功:读取的信息单元的个数
失败: EOF一般情况下, size设为1, nmemb设为想要读取
的字节数或者ptr指向buf 的大小,返回值为实际读
写的字节数。fwrite原型size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp);头文件#include <stdio.h>功能写文件参数ptr: 要写入的缓冲区指针, 提前申请好的size: 要写入的信息单元的大小 一般情况下, size设为1nmemb:要写入的信息单元的个数, size* nmemb不大于ptr大小fp:   要写的文件指针, 提前用fopen打开的返回值成功:写入的信息单元的个数
失败: EOF一般情况下, size设为1, nmemb设为想要读取
的字节数或者ptr指向buf 的大小,返回值为实际读
写的字节数。

代码演示:

#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
    FILE *fp=NULL;int w=0,r=0;char w_buf[12] = "hello world";char r_buf[12];memset(r_buf,0,sizeof(r_buf));fp = fopen("hello.txt","w");if(fp == NULL){
    perror("fopen");return -1;}printf("打开文件成功\n");w = fwrite(w_buf,1,sizeof(w_buf),fp);if(w < 12){
    perror("fwrite");return -1;}printf("w = %d\n",w);rewind(fp);r = fread(r_buf,1,sizeof(r_buf),fp);if(r < 12){
    perror("fread");return -1;}printf("r_buf:%s\n",r_buf);printf("r = %d\n",r);fclose(fp);return 0;
}

格式化读写:

fscanf(格式化输入)int fscanf ( FILE * fp, const char * format, ... );fscanf从fp中格式化输入示例fscanf(fd,"%s",buf);将fd所指向的文件里边的内容输入到buf中fscanf(fp,"%d %s",&c,d);从fp所指向的文件里边读取一个整数给c,在读取一个字符串给dfprintf(格式化输出)int fprintf(FILE *fp, const  char *format, ...)fprintf格式化得到的字符串写到fp指向的文件里面示例  fprintf(fd,"%s","what are you doing ");sprintf(格式化字符串复制)int  sprintf(char  *str,  const  char*format, ...)把某一种类型的数据转换成字符串存放到某一个地址内#include<stdio.h>
main()
{
    
char * a=”This is string A!;
char buf[80];
sprintf(buf,%s\n”,a);
printf(%s”.buf);
}

代码演示:

#include <stdio.h>
#include <string.h>
int main()
{
    int a = 10, b = 20;int c,d;char buff[12];char buf[12]="helloworld";FILE *fp = NULL;fp = fopen("hello.txt","w+");if(fp == NULL){
    perror("fopen");return -1;}fprintf(fp,"%d %d %s",a,b,buf);rewind(fp);fscanf(fp,"%d %d %s",&c,&d,buff);printf("c = %d d = %d buff = %s\n",c,d,buff);fclose(fp);return 0;
}

文件指针定位:
API

rewind:void rewind(FILE *fp);将读写指针定位到文件开始位置,无返回值fseek:将读写指针定位到指定位置fp:要操作的文件offset:偏移量(可正可负)whence:参考位置SEEK_SET  //文件开始SEEK_CUR //文件当前位置SEEK_END //文件尾ftelllong ftell(FILE *fp);返回当前文件读写指针的位置,常用来求文件的大小作用操作定位内部的读写指针

代码演示:

#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
    FILE *fp=NULL;int w=0,r=0;char w_buf[12] = "hello world";char r_buf[12];memset(r_buf,0,sizeof(r_buf));fp = fopen("hello.txt","w+");if(fp == NULL){
    perror("fopen");return -1;}printf("打开文件成功\n");w = fwrite(w_buf,1,sizeof(w_buf),fp);if(w < 12){
    perror("fwrite");return -1;}printf("w = %d\n",w);//fseek(fp,0,SEEK_SET);fseek(fp,-12,SEEK_CUR);r = fread(r_buf,1,sizeof(r_buf),fp);if(r < 12){
    perror("fread");return -1;}printf("r_buf:%s\n",r_buf);printf("r = %d\n",r);fclose(fp);return 0;
}

参考结构流程图:
文件操作
注:需要使用xmind软件进行查看