当前位置:网站首页>文件操作(详解!)
文件操作(详解!)
2022-07-02 09:41:00 【每天少点debug】
文件
1,什么是文件
程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)
数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件
以前的输入指的就是从键盘上输入,输出指的就是显示到屏幕上,
但其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件
2,文件指针FILE
顾名思义:通过文件指针变量能够找到与它关联的文件。
在vs2013中有对FILE有以下声明
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
不同的编译器对FILE的定义不同,但大同小异,我们每打开一个文件,系统会根据情况自动创建一个FILE结构的变量,并且补充其中的信息,一般我们都是用文件指针来对文件进行相关操作。
3,文件的打开与关闭
文件使用方式 含义 如果指定文件不存在 | |
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错 | |
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件 | |
“a”(追加) 向文本文件尾添加数据 建立一个新的文件 | |
“rb”(只读) 为了输入数据,打开一个二进制文件 出错 | |
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件 | |
“ab”(追加) 向一个二进制文件尾添加数据 出错 | |
“r+”(读写) 为了读和写,打开一个文本文件 出错 | |
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件 | |
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件 | |
“rb+”(读写) 为了读和写打开一个二进制文件 出错 | |
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件 | |
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件 |
//打开文件
FILE * fopen ( const char * filename, const char * mode );
第一个参数:打开文件名字
第二个参数:打开方式,必须是双引号,单引号不行
//关闭文件
int fclose ( FILE * stream );
每次打开文件只需要写相应的打开方式就行。
eg:
//以写的方式打开文件
FILE* pf = fopen("text.txt", "w");//为了输出数据,打开一个文本文件
//如果问价不存在就建立一个新的文件
//如果文件存在就消除文件中原来存在的内容
if (pf == NULL)
{
printf("打开文件失败\n");
printf("%s\n", strerror(errno));//打印文件打开失败的相关错误信息
return 0;
}
fclose(pf);
pf = NULL;//在关闭文件之后一定要置空,不然的话会可能出现野指针
这时打开同一个文件夹就会出现一个
打开文件
FILE* pf = fopen("text.txt", "r");//只能打开已经存在的文件,若不存在,则返回NULL
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
fclose(pf);
其他打开方式类似
4,文件的顺序读写
对于文件数据的读取可以分成顺序读写,随机读写,顺序读写顾名思义就是按照我们输入输出的顺序写文件和读文件,而随机读写只是某种意义上的随机读写,具体是什么下面再看。
功能 函数名 适用于 | |
字符输入函数 fgetc 所有输入流 | |
字符输出函数 fputc 所有输出流 | |
文本行输入函数 fgets 所有输入流 | |
文本行输出函数 fputs 所有输出流 | |
格式化输入函数 fscanf 所有输入流 | |
格式化输出函数 fprintf 所有输出流 | |
二进制输入 fread 文件 | |
二进制输出 fwrite 文件 |
fgetc,fputc
fputc:int fputc( int c, FILE stream );将一个字符输出到流中
c:表示需要读取进入流的字符
stream:流
fputc适用于所有流?指的是什么?
拿输出来举例子:输出的话目前我知道的是两个流,是指流向屏幕还是流向文件。
可以将流类比为水,然后屏幕和文件分别是两个方向,方向指哪个那么水就流向哪那么数据就输入或者输出到哪。
当从语言运行程序时,默认会打开三个流:
标准输入流:stdin
标准输出流:stdout 这三个流 的类型都是FILE
标准错误流:stderr
例如:
printf: 标准输出流:stdout(流向屏幕)
scanf:标准输出流:stdout(键盘)
fgetc:int fgetc( FILE *stream );从流中读取字符到内存中,并且返回读取到的字符
FILE* pf = fopen("data.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
int ch = 0;
//while ((ch = fgetc(stdin)) != EOF)//当错误或者文件结束是返回的是EOF
while ((ch = fgetc(pf)) != EOF)//当错误或者文件结束是返回的是EOF
{
printf("%c ", ch);
}
fputs,fgets
fputs:int fputs( const char *string, FILE *stream );
string:需要读取的字符串
streat:字符串应该流向的流
返回值:如果成功执行,这些函数将返回一个非负值。发生错误时,fputs返回EOF
fgets:char *fgets( char *string, int n, FILE *stream );
string:从流中提取的数据粗存在该字符串中
n:fgets从流的当前位置读取字符,包括第一个换行符,读取到流的末尾,或者直到读取的字符数等于n - 1,储存在字符后结尾会自动增加一个’\0’
stream:从哪个流中提取数据
fscanf ,fprint
fread/fwrite
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
返回值:返回实际读取的完成条目数
buffer:从流中读取的条目储存在buffer中
size:读取的每个整体的大小(以字节为单位)
count:读取的最大条目个数
stream:读取条目的来源,是从标准输入流(键盘)还是文件输入
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
返回值:返回成功写入流中的完整条目数
size:写入的每个条目的大小
count:写入的最大条目数
stream:同fread
feof/ferror
int main()
{
FILE* pf = fopen("data,txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
int ch = 0;
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((ch = fgetc(pf)) != EOF);//标注读取文件操作循环
//判断是什么原因造成的
if (ferror(pf))//如果流上没有发生错误,ferror返回0。否则,它返回一个非零值。
puts("I/O error when reading");
else if (feof(pf))//eof函数在第一次读操作试图读到文件末尾之后返回一个非零值。
//如果当前位置不是文件末尾,则返回0。
puts("End of file reached successfully");
fclose(pf);
return 0;
}
边栏推荐
- SSRF
- deepTools对ChIP-seq数据可视化
- MySQL basic statement
- Wechat applet uses Baidu API to achieve plant recognition
- Amazon cloud technology community builder application window opens
- Introduction to interface debugging tools
- tidb-dm报警DM_sync_process_exists_with_error排查
- Is the stock account given by qiniu business school safe? Can I open an account?
- ImportError: cannot import name ‘Digraph‘ from ‘graphviz‘
- 从ros1到ros2配置的一些东西
猜你喜欢
ImportError: cannot import name ‘Digraph‘ from ‘graphviz‘
基于Hardhat和Openzeppelin开发可升级合约(一)
Map set assignment to database
2022年遭“挤爆”的三款透明LED显示屏
Amazon cloud technology community builder application window opens
可升级合约的原理-DelegateCall
MySQL linked list data storage query sorting problem
K-Means Clustering Visualization in R: Step By Step Guide
CTF record
RPA advanced (II) uipath application practice
随机推荐
Bedtools tutorial
Three transparent LED displays that were "crowded" in 2022
Verilog and VHDL signed and unsigned number correlation operations
Visualization of chip SEQ data by deeptools
MySQL stored procedure cursor traversal result set
Map set assignment to database
Attribute acquisition method and operation notes of C # multidimensional array
【IDEA】使用插件一键逆向生成代码
2022年遭“挤爆”的三款透明LED显示屏
flutter 问题总结
解决uniapp列表快速滑动页面数据空白问题
Seriation in R: How to Optimally Order Objects in a Data Matrice
Importerror: impossible d'importer le nom « graph» de « graphviz»
map集合赋值到数据库
vant tabs组件选中第一个下划线位置异常
How to Create a Nice Box and Whisker Plot in R
PLC-Recorder快速监控多个PLC位的技巧
Is the stock account given by qiniu business school safe? Can I open an account?
Jinshanyun - 2023 Summer Internship
[multithreading] the main thread waits for the sub thread to finish executing, and records the way to execute and obtain the execution result (with annotated code and no pit)