C语言基础文件操作方式超全详解建议收藏

 更新时间:2021年10月14日 00:00  点击:2273

什么是文件

磁盘上的文件是文件。

在程序设计中,我们一般读的文件有两种:程序文件 和 数据文件

程序文件包括源程序文件(后缀为.c)、目标文件(win下后缀为 .obj)、可执行文件(win下环境后缀为.exe)

数据文件:文件的内容不一定是程序,而是运行时读写的程序,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

文件名

一个文件要有一个唯一的文件标识,以便于用户识别与引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

c:\code\test.txt

文件类型

文本文件:肉眼看得懂的东西

二进制文件:数据在内存中中以二进制形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符(对应ASCII的值)的形式存储的文件就是文本文件。

文件指针

文件类型指针(文件指针)

每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的相关信息(如文件名字,文件状态,文件当前的位置)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名为FILE.

vs2019编译环境中提供的 stdio.h头文件中有以下的文件类型声明。

#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

不同C编译器的FILE类型包含内容大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。

一般都是通过FILE的指针来维护这个FILE结构的变量。

FILE *pf;

定义pf是一个指向FILE类型数据的指针变量,可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量可以找到与他关联的相关文件。

总结:每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的相关信息,这个相关信息是个结构体,使用typedef类型重新定义,也就是FILE

文件的打开与关闭

在打开文件的同时,会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSIC规定使用fopen来打开文件,fclose来关闭文件。

相对路径写法(当前代码所在路径下)

… 表示上一级路径

. 表示当前路径

FILE* p = fopen("../test.txt","r");    //打开当前路径低下 的test文件

绝对路径写法(明确指出)

fopen("C:\\2012_code\\84\\test\\test1.txt ","r");

打开方式

文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件(销毁原来的文件信息)
“a”(追加) 向文本文件尾添加数据 出错
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件(销毁原来的文件信息)
“ab”(追加) 向一个二进制文件添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建立一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件

如果文件打开失败,返回空指针NULL

在这里插入图片描述

FILE* pf = fopen("text.txt","r");
if(pf == NULL)
{
    printf("%s\n",strerror(errno));
    return 0;
}
fclose(pf);
pf = NULL;

关闭文件时是值传递,不会改变文件本身。

文件的顺序读写

结合MSDN食用更好

功能 函数名 适用于
字符输入函数 int fgetc( FILE * stream); 所有输入流
字符输出函数 int fputc(int c, FILE* stream); 所有输出流
文本行输入函数 char *fgets(char* string, int n, FILE* stream) 所有输入流
文本行输出函数 int fputs(const char* string, FILE* stream) 所有输出流
格式化输入函数 fscanf把文件假想成黑色的对话框。和普通的scanf相比,前面多了一个指向文件信息的指针。 所有输入流
格式化输出函数 fprintf 和普通的printf相比,前面多了一个指向文件信息的指针。(把数据放到文件里了) 所有输出流
二进制输入 fread : 返回类型是读了几个元素 文件
二进制输出 fwrite 文件

键盘stdin和屏幕stdout都是外部设备, stdin和stdout都是FILE类型的

键盘stdin和屏幕stdout都是外部设备, stdinstdout都是FILE类型的

键盘 - 标准输入设备; 屏幕 - 标准输出设备

是一个程序默认打开的两个流设备。

关于fread的返回值

fread returns the number of full items actually read, 
which may be less than count if an error occurs or if the end of the file is encountered before reaching count.
Use the feof or ferror function to distinguish a read error from an end-of-file condition.
If size or count is 0,
fread returns 0 and the buffer contents are unchanged.

对比一组函数

scanfprintf:针对标准输入流、标准输出流的格式化输入、输出语句

fscanffprintf:针对所有输入流、所有输出流的格式化输入、输出语句

sscanfsprintf:

sscanf :从字符串中读取格式化的数据

Read formatted data from a string.

int sscanf( const char *buffer, const char *format [, argument ] ... );

sprintf:把格式化的数据存储到字符串中

Write formatted data to a string.

int sprintf( char *buffer, const char *format [, argument] ... );

用途:记录日志

但是文件不安全,不够高效 ------>>>> 数据库 MySQL ?

使用文件的格式:

打开文件 — 安全检查 ---- 操作 ---- 关闭文件

文件随机读取

fseek根据文件指针的位置和偏移量定位文件指针。

fseek
Moves the file pointer to a specified location.
int fseek( FILE *stream, long offset, int origin );
offset: 偏移量(单位字节)   origin:文件指针当前位置

文件当前位置的三种形式:

SEEK_CUR
Current position of file pointer

SEEK_END
End of file

SEEK_SET
Beginning of file

ftell返回文件指针相对于起始位置的偏移量。

ftell  
Gets the current position of a file pointer.
long ftell( FILE *stream );

应用

int main()
{
    FILE* pf = fopen("test.txt","r");
    if(pf == NULL)
    {
		printf("%s\n",strerror(errno));
    }
    //1.定位文件指针
    fseek(pf, 2, SEEK_CUR);
    //2.读取文件
    int ch = fgetc(pf);
    
    printf("%c",ch);
    
    fclose(pf);
    pf=NULL;
	return 0;
}

rewind:让文件指针回到起始位置

rewind  
Repositions the file pointer to the beginning of a file.
void rewind( FILE *stream );

文件结束判断

在文件读取过程中,不能用feof函数的返回值直接用来判断文件是否结束。

Return Value

The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)

​ fgetc判断是否是EOFfgets判断返回值是否为NULL

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。比如:通过fread判断返回值是否小于实际要读的个数。

perror()

函数直接先打印你放在括号里面的字符串,然后接着打印冒号和错误信息。

ferror()

Return Value

If no error has occurred on stream, ferror returns 0. Otherwise, it returns a nonzero value.

应用

int main()
{
	FILE* pf = fopen("test.txt","r");
    if(pf == NULL)
    {
        perror("open file test2.txt");
        return 0;
    }
    //读文件
    int ch = 0;
    while((ch = fgetc(pf)) != EOF)
    {
		putc(ch);
    }
    if(ferror(pf))
    {
		printf("error\n");
    }
    else if(feof(of))
    {
		printf("end of file");
    }
	return 0;
}

以上就是C语言文件操作方式超全详解建议收藏的详细内容,更多关于C语言文件操作方式的资料请关注猪先飞其它相关文章!

[!--infotagslink--]

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • C语言中计算正弦的相关函数总结

    这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
  • 详解C语言中的rename()函数和remove()函数的使用方法

    这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • nodejs文件操作模块FS(File System)常用函数简明总结

    件系统操作相关的函数挺多的。首先可以分为两大类。一类是异步+回调的。 一类是同步的。在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可1. 首先是一类最常规的读写函数,函数名称和形式,应该是起源于C...2014-06-07
  • C语言中求和、计算平均值、方差和标准差的实例

    这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
  • C语言的基本语法详解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
  • C语言中send()函数和sendto()函数的使用方法

    这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • PHP安装threads多线程扩展基础教程

    一、下载pthreads扩展下载地址:http://windows.php.net/downloads/pecl/releases/pthreads二、判断PHP是ts还是nts版通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说...2015-11-24
  • C语言实现从文件读入一个3*3数组,并计算每行的平均值

    今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • 使用C语言操作文件的基本函数整理

    这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
  • C语言中memcpy 函数的用法详解

    这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
  • C语言中查找字符在字符串中出现的位置的方法

    这篇文章主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下...2020-04-25
  • 编程新手必须掌握的:session与cookie的区别

    session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
  • C语言菜鸟基础教程之a++与++a

    很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...2020-04-25
  • Flex网页布局基础入门及实例教程

    Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。本教程我们来学习一下Flex布局的基本语法知识及运用实例。 网页布局(layout)是CSS的一...2016-09-14
  • 一文秒懂JavaScript DOM操作基础

    通过这篇文章帮助大家快速学习JavaScript DOM操作基础的相关知识,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧...2021-04-30
  • C语言实现时间戳转日期的算法(推荐)

    下面小编就为大家带来一篇C语言实现时间戳转日期的算法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25