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

 更新时间:2021年10月13日 16:44:10   作者:Bitdancing  
这篇文章主要为大家介绍了关于C语言文件操作方式的详细总结,建议收藏随用随看,有需要的朋友可以借鉴参考下,希望能够有所帮助

什么是文件

磁盘上的文件是文件。

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

程序文件包括源程序文件(后缀为.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语言文件操作方式的资料请关注脚本之家其它相关文章!

相关文章

  • C语言FlappyBird飞扬的小鸟实现开发流程

    C语言FlappyBird飞扬的小鸟实现开发流程

    因为在家宅了好多天,随手玩了下自己以前做的一些小游戏,说真的,有几个游戏做的是真的劣质,譬如 flappybird 真的让我难以忍受,于是重做了一波分享给大家
    2022-11-11
  • c++创建二维动态数组与内存释放问题

    c++创建二维动态数组与内存释放问题

    这篇文章主要介绍了c++创建二维动态数组与内存释放问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • C++ OpenCV实战之图像透视矫正

    C++ OpenCV实战之图像透视矫正

    这篇文章主要介绍了通过C++ OpenCV实现图像的透视矫正,文中的示例代码讲解详细,对我们的学习或工作有一定的参考价值,感兴趣的可以了解一下
    2022-01-01
  • C语言全方位讲解指针的使用

    C语言全方位讲解指针的使用

    指针是C语言中一个非常重要的概念,也是C语言的特色之一。使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针还可以返回多个值
    2022-04-04
  • C++ ROS与boost:bind()使用详解

    C++ ROS与boost:bind()使用详解

    boost::bind是标准库函数std::bind1st和std::bind2nd的一种泛化形式,其可以支持函数对象、函数、函数指针、成员函数指针,并且绑定任意参数到某个指定值上或者将输入参数传入任意位置,本文重点介绍下C++ ROS与boost:bind(),感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • 详解C语言中printf输出的相关函数

    详解C语言中printf输出的相关函数

    这篇文章主要介绍了C语言中printf输出的相关函数总结,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C++一个函数如何调用其他.cpp文件中的函数

    C++一个函数如何调用其他.cpp文件中的函数

    这篇文章主要介绍了C++一个函数如何调用其他.cpp文件中的函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言数组实现三子棋应用实例

    C语言数组实现三子棋应用实例

    这篇文章主要为大家详细介绍了C语言数组实现三子棋应用实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Opencv实现联合双边滤波

    Opencv实现联合双边滤波

    这篇文章主要为大家详细介绍了Opencv实现联合双边滤波,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C语言利用数组和文件实现登录注册功能

    C语言利用数组和文件实现登录注册功能

    这篇文章主要为大家详细介绍了C语言利用数组和文件实现登录注册功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12

最新评论