精华内容
下载资源
问答
  • 本博文为半摘记性质,收集整理自菜鸟教程、《二级C》及其他互联网资料 —— 结构体以及文件操作(下) “文件”是指一组相关数据的有序集合。...操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件

    本博文为半摘记性质
    ——
    声明:部分知识点及例程修改自https://www.runoob.com/cprogramming/c-tutorial.html 菜鸟教程、《全国计算机等级考试-上机考试新版题库 二级C》,另有部分零散资料转自互联网,内容有一定改动,并非全文转载。
    本人尊重各位的知识成果,大幅引用的文章原文网址已在各小节末尾给出。

    结构体以及文件操作(下)

    本文要点:

    1. 文件

    文件

    “文件”是指一组相关数据的有序集合。
    在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如:

    1. 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;
    2. 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数据。

    缓冲区

    缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区

    从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度

    C语言利用缓冲文件系统管理文件的时候,系统将自动为每一个打开的文件建立缓冲区,此后程序对文件的读写操作实际上时对文件缓冲区的操作。

    http://soft.chinabyte.com/database/47/12481547.shtml 原文链接已失效
    可用的转载性质文章的链接:https://blog.csdn.net/qq_35375147/article/details/79633569 解析C语言编程对缓冲区的理解

    1文件类型指针的定义

    在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。
    文件类型指针变量的定义方式

    FILE *指针变量//FILE必须大写
    

    一般来说打开多少个文件就有多少个文件型指针变量指向对应的文件。

    2操作文件

    操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件

    2.1打开标准文件

    为了打开一个文件,需要知道打开的文件名、文件的使用方式(读or写)以及让哪个指针变量指向被打开的文件。
    可以通过调用系统函数fopen()函数来实现文件打开操作,其定义形式为:

    FILE *fopen(char *filename, char *mode);
    

    其中filename是要打开的文件名,可以是字符串常数、字符型数组、字符型指针或路径;mode指明打开文件的模式:
    在这里插入图片描述

    2.2标准文件的读或写的操作

    文件的使用包括读、写、文件指针的定位等,由打开文件时的mode参数决定。
    常用的读写和定位函数:

    1. fgetc文件字符读入函数(file get char)
      用于读入一个字符,使用形式:
    char ch=fgetc(pf)//pf是文件指针
    //功能是从pf指定的文件中读入一个字符,并作为函数值返回
    
    1. fputc文件字符输出函数(file get char)
      用于输出一个字符,使用形式:
    fputc(ch,fp);//将字符ch写到文件指针fp所指的文件中
    //如果输出成功,fputc函数返回所输出的字符;如果输出失败,则返回一个EOF值
    

    ——

    1. feof文件结束判断函数
      用于判断文件是否结束,使用形式:
    feof(fp);//文件结束值为1,否则为0
    

    ——

    1. fscanf文件输入函数
      使用形式:
    fscanf(文件指针,格式控制字符串,输入项表);
    
    1. fprintf文件输出函数
      使用形式:
    fprintf(文件指针,格式控制字符串,输入项表);
    

    fscanf函数和fprint函数的读写对象为磁盘文件而非键盘和显示器。
    ——

    1. fgets文件字符串读入函数
      使用形式:
    fgets(str,n.fp);
    //函数从fp所指文件中读入n-1个字符放入以str为起始地址的空间内
    
    1. fputs文件字符串输出函数
      使用形式:
    fputs(str,fp);
    //函数往文件输出字符串
    

    ——

    1. fread读二进制文件函数
      使用形式:
    fread(buffer,size,count,fp);
    //buffer是数据块的指针,对fread来说,它是内存块的首地址,输入的数据存入此内存块中
    

    buffer是数据块的指针;size表示每个数据块的字节数;count用来指定每读、写一次输入或输出数据库的个数;

    1. fwrite写二进制文件函数
      使用形式:
    fwrite(buffer,size,count,fp);
    //buffer对于fwrite来说是准备输出的数据库的起始地址
    

    ——
    文件定位函数:用于移动文件指针

    1. fseek函数
      用来移动文件位置指针到指定的位置上,接着的读或写操作将从此开始。
      使用格式:
    fseek(pf,offset,origin);
    

    如果执行成功,pf将指向以origin为基准,偏移offset(指针偏移量)个字节的位置,函数返回0;
    如果执行失败,则不改变spf指向的位置,函数返回一个非0值。

    1. rewind函数
      使文件位置指针重新返回文件的开头,此函数没有返回值。
      使用形式:
    rewind(fp); 
    

    2.3标准文件的关闭操作

    关闭文件采用fclose函数实现,使用形式为:

    fclose(fp);
    

    文件指针指向要关闭的文件,当文件正常关闭时,函数返回0,否则返回EOF。

    展开全文
  • C语言文件定义

    2021-05-27 14:29:35
    文件定义 在使用电脑的时候,我们经常操作文件。例如,我们可以新建一个.txt类型的文本文件,在里面存放数据。在Windows电脑下,进入一个文件夹,单击右键,选择“新建”---> “文本文档”,如下图: ...

    文件的定义

           在使用电脑的时候,我们经常操作文件。例如,我们可以新建一个.txt类型的文本文件,在里面存放数据。在Windows电脑下,进入一个文件夹,单击右键,选择“新建”---> “文本文档”,如下图:

     

           此时,我们新建一个.txt类型的文本文件。我们可以设置该文件的名称是123.txt,如下图:

     

           然后,我们可以在该文件中存储数据。双击打开123.txt文本文件,然后,输入需要存储的数据,如下图:

           最后,单击左上角的“文件”---> “保存”就可以保存文件的数据。该文件保存到硬

    最后,单击左上角的“文件”---> “保存”就可以保存文件的数据。该文件保存到硬盘上。例如,上面的例子,创建的123.txt文件就保存到G盘目录下。保存文件之后。此时,在电脑上就新建了一个123.txt文件,文件里存放“aaabbb”字符串信息。

           此时,我们通过键盘和鼠标,新建了一个文本文件,并给文件写入数据。那么,我们能否通过软件来自动实现这个功能?

           C语言提供了一系列的接口函数,用于操作文件。可以新建一个文件、读写文件的数据。下面我们学习C语言对文件的操作,并结合实际的例子,掌握这些文件操作函数在实际项目中的应用。

    韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

    展开全文
  • 想了解C语言文件定义等相关知识请查看我的另一篇博客:C语言文件详解 定义一个指向文件(FILE类型数据)的指针 FILE *fp; 指向文件的指针变量并不是指向外部介质上的数据文件的开头,而是指向内存中的文件信息区...


    想了解C语言文件定义等相关知识请查看我的另一篇博客:C语言文件详解

    一、定义一个指向文件(FILE类型数据)的指针

    FILE *fp;
    

    在这里插入图片描述

    指向文件的指针变量并不是指向外部介质上的数据文件的开头,而是指向内存中的文件信息区的开头。

    二、打开关闭文件

    1.打 开文件fopen

    一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系。

    • 使用fopen打开数据文件
    FILE *fp;				//定义一个指向文件的指针变量fp
    fp=fopen("a","r";	//以只读方式打开一个叫做a的文件
    
    • 打开文件常用方法:
    if(fp=fopen("file1","r")==NULL)		//如果打开出错
    {
    	printf("cannot open this file");
    	exit(0);
    }
    

    fopen要点:
    (1)需要打开文件的名字,如上面的a
    (2) 使用文件的方式(“读”还是“写”等)
    (3)一个文件指针,用来标识该文件

    文件使用方式

    2.关闭文件fclose

    “关闭”,就是使文件指针变量不再指向该文件。

    fclose(fp);
    

    fclose成功地执行了关闭操作,则返回值为0;否则返回EOF(-1)。
    在使用完一个文件后应该关闭它,以防止它再被误用
    如果不关闭文件就结束程序运行将可能会丢失数据。

    三、顺序读写数据文件

    1.从文件读一个字符fgetc
    fgetc(fp)//成功,返回所读字符;失败,返回,返回文件结束标志:EOF(即-1)
    
    2.向文件写一个字符fputc
    fputc(ch,fp)//成功,返回输出字符;失败,返回EOF(即-1)
    
    示例:

    1.从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“!”为止

    2.将一个磁盘文件中的信息复制到另一个磁盘文件中。要求将建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中。

    3.从文件读字符串fgets

    从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中

    fgets(str,n,fp);		//读成功,返回地址str,失败则返回NULL
    //函数原型:
    char *fgets(char*str, int n, FILE*fp);
    
    4.从文件写字符串fputs

    假定str是一个指向字符串的指针,我们要把他写入fp指向的文件中

    fputs(str,fp);		//输出成功,返回0;否则返回非0值
    //函数原型:
    int fputs (char *str, FILE *fp);
    

    四、用格式化的方式读写文本文件

    1.格式化写函数fprintf

    栗子:将int型变量i和float型变量f的值按%4d和%.2f的格式输出到fp指向的文件中

    fprintf (fp,%4d,%.2f,i,f);
    
    1.格式化读函数fscanf

    栗子:文件上有字符“1,2.2”,从中读取整数2送给整型变量i,读取实数2.2送给float型变量f

    fscanf (fp,%d,%f″,&i,&f);
    

    它们与printf函数和scanf函数相似,只是fprintf和fscanf函数的读写对象不是终端而是文件。函数区别就是前面要加文件指针

    五、用二进制方式向文件读写一组数据

    1.写函数fwrite
    fwrite(buffer, size, count, fp);
    
    • buffer: 是一个地址。对fwrite,是要把此地址开始的存储区中的数据向文件输出(。对fread,它是用来存放从文件读入的数据的存储区的地址以上指的是起始地址)。
    • size: 要读写的字节数。
    • count: 要读写多少个数据项(每个数据项长度为size)。
    2.读函数fread
    fread(buffer, size, count, fp);
    

    栗子:从fp所指向的文件读入10个4个字节的数据,存储到数组f中

    • buffer为f
    • size为4
    • count为10
    fread(f,4,10,fp);	//从fp所指向的文件读入10个4个字节的数据,存储到数组f中
    
    示例:

    使用fread,fwrite读写文件

    六.随机读写数据文件

    不了解文件位置等概念的朋友请看:C语言文件:文件位置标记及其定位

    1.使文件位置标记指向文件开头rewind

    rewind(文件指针);

    rewind(fp);
    

    rewind函数的作用是使文件位置标记重新返回文件的开头,此函数没有返回值

    2.改变文件位置标记fseek
    • 0代表“文件开始位置”,1为“当前位置”,2为“文件末尾位置”
    • “位移量”:指以“起始点”为基点,向前移动的字节数(长整型)

    fseek(文件类型指针, 位移量, 起始点);

    fseek (fp,50L,0);		//L代表长整型,将文件位置标记向前移到离文件开头50个字节处
    fseek (fp,100L,1); 		//将文件位置标记向前移到离当前位置100个字节处
    fseek (fp,-10L,2);		//将文件位置标记从文件末尾处向后退10个字节
    
    3.测定文件位置标记的当前位置ftell
    • ftell函数的作用是得到流式文件中文件位置标记的当前位置,用相对于文件开头的位移量来表示。
    • 调用函数时出错(如不存在fp指向的文件),ftell函数返回值为-1L。
    t=ftell(fp);			 //变量存放文件当前位置
    if(t==-1L) printf(″error\n″); 	//如果调用函数时出错,输出″error″
    

    七、文件读写的出错检测

    1.出错检测 ferror(fp);

    在调用各种输入输出函数(如putc,getc,fread,fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。

    • 在执行fopen函数时,ferror函数的初始值自动置为0。
    • 如果返回一个非零值,表示出错。
    • 对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。
    • 只要出现文件读写出错标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。
    2.清除错误标志:clearerr(fp);

    ferror函数值为一个非零值,即其他函数出错时。应该立即调用clearerr(fp),使ferror(fp)的值变成0,以便再进行下一次的检测。

    有疑问欢迎在评论区留言,有时间将为您做出回复

    展开全文
  • C语言定义相关

    2019-04-01 22:56:16
    博客搬家,原地址:https://langzi989.github.io/2017/06/11/C语言定义相关/ C语言定义在代码编写中很常见,它常会带来一些很高的性能...Linux中sockaddr_in的定义文件/netinet/in.h文件中。具体如下: /* St...

    博客搬家,原地址:https://langzi989.github.io/2017/06/11/C语言宏定义相关/

    C语言宏定义在代码编写中很常见,它常会带来一些很高的性能和很方便的写法,在看Linux源码中sockaddr_in的时候遇到宏定义中##。特地在此记录.

    宏定义中##用法

    问题背景

    Linux中sockaddr_in的定义在文件/netinet/in.h文件中。具体如下:

    /* Structure describing an Internet socket address.  */
    struct sockaddr_in
      {
        __SOCKADDR_COMMON (sin_);
        in_port_t sin_port;                 // Port number.  
        struct in_addr sin_addr;            // Internet address.  
    
        // Pad to size of struct sockaddr.
        unsigned char sin_zero[sizeof (struct sockaddr) -
                               __SOCKADDR_COMMON_SIZE -
                               sizeof (in_port_t) -
                               sizeof (struct in_addr)];
      };
    
    #define __SOCKADDR_COMMON(sa_prefix)\
      sa_family_t sa_prefix##family
    

    从上面可以看出,__SOCKADDR_COMMON的宏定义中出现了##的使用方法。那它在宏定义中的意思是什么呢?

    ##详解

    ##是一种分隔连接方式。它的作用是先分隔,然后进行强制连接。

    在普通的宏定义中,预处理器一般吧空格解释为分段标志,然后进行相应的替换工作。但是这样做的结果是被替换的段之间会出现空格。如果我们不希望这些空格出现,可以使用##来代替空格。

    如:

    #define type1(type,name) type name_##type##_type
    #define type2(type,name) type name##_##type##_type
    

    上述type1(int,c)将被替换为:int name_int_type
    上述type2(int,c)将被替换为:int c_int_type

    故我们再回去看__SOCKADDR_COMMON的宏定义.
    _SOCKADDR_COMMON (sin);将被解释为sa_family_t sin_family;

    注意在函数参数中使用##可以将空字符串过滤掉,否则会出现问题。如:

    
    #define comac_get_args_cnt( ... ) comac_arg_n( __VA_ARGS__ )
    #define comac_arg_n( _0,_1,_2,_3,_4,_5,_6,_7,N,...) N
    #define comac_args_seqs() 7,6,5,4,3,2,1,0
    #define comac_join_1( x,y ) x##y
    
    //计算可变参数...中参数的个数.注意由于seq的范围为7-0,该宏可识别的参数个数的范围为0-7个。超过7个参数识别有问题
    #define comac_argc( ... ) comac_get_args_cnt( 0,##__VA_ARGS__,comac_args_seqs() )
    
    int main() {
      //若上述comac_get_cnt中的__VA_ARGS__去掉##,结果为1,加上为0。
      comac_argc();
    }
    

    #详解

    在宏定义中,#符号的作用是将宏定义参数用""括起来,

    #define example(test) printf("%s", #test);
    example(123 456); //printf("%s", "123 456");
    

    宏定义中占位符理解

    在宏定义中我们可以使用字母或者单词作为占位符,初次之外,我们也可以使用_1,_2作为占位符,不要被它蒙骗了,其作用与单词作为占位符相同。如:

    #define sum(a,b) (a+b)
    #define sum(_1,_2) (_1+_2)//作用同上
    
    展开全文
  • C语言头文件定义

    2020-07-18 13:06:20
    //在头文件当中可以定义一些接口(函数原型)和类型 全局变量等 //为了避免编译时间和效率过低 不要将实现部分放在头文件当中 #ifndef _TEST_HEADER_H_ #define _TEST_HEADER_H_ void display_message(); typedef ...
  • C语言文件操作

    2020-05-24 20:54:37
    由于结构指针的参数传递效率更高,因此C语言文件操作统一以文件指针方式实现。 定义文件类型指针的格式为:**FILE \*fp;** 其中FILE是文件类型定义符,fp是文件类型的指针变量。文件指针是特殊指针,指向的是文件...
  • C语言定义

    2012-11-15 22:17:12
    定义是C提供的三种预处理(宏定义文件包含、条件编译)的其中一种,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率。 在C语言中允许用一个标识符来表示一个字符串,称为宏...
  • C语言文件操作函数大全

    万次阅读 多人点赞 2018-01-19 20:35:35
    C语言文件操作函数大全 2018-1-19  13.1C语言文件 1,两种文件存取方式(输入,输出方式) 顺序存取 直接存取 2,数据的两种存放形式 文本文件 二进制文件 13.2文件指针 定义文件类型指针变量的一般...
  • 上一节课, 我们讲解了条件编译的一些知识, 这次我们来讲解一下怎么运用宏定义来进行多文件编译. 现在来让我们看一个例子: 输出的结果: PS: 1.运用多个文件编译的时候, 一定要把所有的.c文件...
  • c语言文件之间变量的定义和声明

    千次阅读 2019-06-02 19:40:51
    发现自己并不明白多文件之间的变量定义和声明,在这里做个记录。建议使用codeblocks 让我们来看看程序是咋写的文件目录结构 123456789主菜单 menu.c成绩输入 stu1.c :在文件stu.dat中增加一个或多个新的学生和相应...
  • C语言文件定义,如何对文件进行操作,文件指针,如何定义指向文件的指针,通过文件指针对文件进行操作,文件应用举例,二进制文件相关操作,文件定位
  • C语言文件操作大全

    2020-12-25 22:32:38
    C语言访问文件的方式一共有12种。由这几个关键字组合而成:read,write,append(追加),text(文本文件),banary(二进制文件),+表示读和写。 4、文件的关闭:fclose(); 操作系统对打开的文件数量有限制,
  • C语言文件操作详解

    万次阅读 多人点赞 2015-12-11 16:46:40
    C语言文件操作函数 函数介绍 文件打开与关闭操作 fopen():文件打开操作 头文件:stdio.h 函数定义:FILE *fopen(char *pname, char *mode) 函数说明:pname是文件名,mode是打开文件的方式 mode:"r" 打开一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,295
精华内容 3,718
关键字:

c语言文件定义

c语言 订阅