C语言基础(20)-文件操作(fopen,getc,fclose)
一.文件操作
读文件的顺序:
1.先打开文件
2.读写文件
3.关闭文件
1.1 fopen
FILE *fopen( const char *path, const char *mode );
函数说明:
1.path就是指定打开文件的路径,可以是相对路径,也可以绝对路径。mode代表打开文件的方式
2.fopen打开成功,返回FILE的有效地址,失败返回NULL.
3.fopen返回的指针是不能自己计算的,一定是要给C语言文件操作的库函数操作的
r 以只读方式打开文件,该文件必须存在,文件必须是可读的。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
1.2 getc
int getc( FILE *stream );
函数说明:
1.getc的功能是一个字节一个字节的读取文件内容
2.stream代表返回的FILE有效地址
1.3 fclose
int fclose( FILE *stream );
函数说明:
函数fclose()关闭给出的文件流, 释放已关联到流的所有缓冲区. fclose()执行成功时返回0,否则返回EOF.
示例代码:
#include <stdlib.h>
#include <stdio.h> #pragma warning(disable:4996) void fopenUseDemo(void); int main()
{ fopenUseDemo();
system("pause");
return ; } void fopenUseDemo(void)
{
// p 这个指针一般不用来计算,主要的用处是给C语言库函数作为参数
// 1.打开文件
FILE *p = fopen("E:\\CrackCaptcha.log","r");
if (p == NULL) {
printf("文件打开失败\n");
}else {
//printf("文件打开成功\n");
//char c = getc(p);
//printf("%c\n",c); // 输出2
//char d = getc(p); // 第二次调用getc的时候,getc会自动从第二个BYTE开始读取文件的内容,这个是不需要我们通过代码干预的。
//printf("%c\n", d);// 输出0 // 2.读取文件内容
char c = ;
while (c != EOF) // 只要不是文件结尾,那么就一直循环
{
c = getc(p);
printf("%c",c);
} // 3.关闭文件
fclose(p); // p代表fopen成功返回的值
} }
输出结果:
1.4 putc
int fputc( int ch, FILE *stream );
函数说明:
1.第一个参数是要写入的char
2.第二个参数是fopen返回的指针
示例代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h> void fopenUseDemo1(void);
void fopenUseDemo2(void); // int fputc( int ch, FILE *stream );
// 第一个参数是要写入的char
// 第二个参数是fopen返回的指针 void fopenUseDemo1(void)
{
FILE *p = fopen("E:\\xp.chen.txt","w");
if (p)
{
printf("执行成功\n");
char a[] = "hello world";
int len = strlen(a);
for (int i = ; i < len; i++)
putc(a[i],p);
fclose(p);
} } // 实现简单的文件拷贝
void fopenUseDemo2(void)
{
FILE *p1 = fopen("E:\\xp.chen.txt","r");
FILE *p2 = fopen("E:\\naruto.txt","w");
if (p1&&p2)
{
// 读取p1,将读取到的内容写入p2,就实现了文件的拷贝
char c = ;
while ()
{
char c = getc(p1); // 从p1中读一个字节
if (c == EOF)
break;
putc(c,p2); // 将p1中读到的字节写到p2
}
fclose(p1);
fclose(p2);
} }
1.5 fgets
char *fgets( char *str, int num, FILE *stream );
函数说明:
1.第一个参数代表待存储的字符串,第二个参数代表待存储的字符串的长度,第三个参数代表打开的文件路径
示例Demo:
#include <stdlib.h>
#include <stdio.h>
#include <string.h> void fgetsUseDemo(void); void fgetsUseDemo(void)
{ FILE *p = fopen("E:\\naruto.txt","r");
if (p)
{
//char a[100] = {0};
//fgets(a, sizeof(a), p);//从p中读一行,包括行尾的回车
//printf("%s\n",a); // 示例1:循环读取文件内容
//while (1)
//{
// char a[100] = {0};
// fgets(a,sizeof(a),p); // 从p中读一行,包括行尾的回车
// if (feof(p)) // 如果p已经到了文件最后,feof返回true
// break;
// printf("%s",a);
//} char a[] = {};
fgets(a,sizeof(a),p);
printf("%s",a); // 示例2:循环读取所有文件内容
while (!feof(p))
{
char a[] = {};
fgets(a,sizeof(a),p);
printf("%s",a);
} fclose(p);
} }
int feof( FILE *stream );
注意:
1.如果文件已经到达文件结尾,feof()函数返回true
2.传入的参数是fopen返回的文件指针
1.6 fputs
int fputs( const char *str, FILE *stream );
函数说明:
1. 第一个参数代表需要写入的内容,第二个参数代表将要写入的文件
#include <stdlib.h>
#include <stdio.h>
#include <string.h> void fputsUseDmeo(void); void fputsUseDmeo(void)
{ FILE *p = fopen("E:\\xp.chen.txt","w");
if (p)
{
char a[] = "仙法!超大玉螺旋手里剑";
fputs(a,p);
} }
1.7 fprintf()
int fprintf( FILE *stream, const char *format, ... );
函数说明
1.用法和printf一样,只是多了第一个参数,该参数代表打开的文件指针
// int fprintf( FILE *stream, const char *format, ... );
void fprintfUseDemo(void)
{
FILE *p = fopen("E:\\temp.txt","w");
char a[] = "hello";
fprintf(p,"%s",a); // 用法和printf一样,只是多了第一个参数,参数是打开的文件指针 int a1 = ;
int a2 = ; /*sprintf(a,"%d%d",a1,a2);
fputs(a,p);*/ fprintf(p,"%d,%d",a1,a2);
fclose(p); }
1.8 fscanf
int fscanf( FILE *stream, const char *format, ... );
函数说明:
1.第一个参数代表打开的文件指针
2.第二个参数代表匹配的文本
3.第三个参数代表需要赋值的变量指针。
示例代码:
假设E盘下有有一文本文件为xp.chen.txt,内容为:
则可通过fscanf来计算以上两个表达式的和
void fscanfUseDemo1(void)
{ FILE *p = fopen("E:\\xp.chen.txt","r");
int a1, a2;
fscanf(p,"%d+%d",&a1,&a2);
//printf("a1=%d, a2=%d\n",a1,a2);
printf("%d\n",a1+a2); // 计算当前两个数的和
fscanf(p, "%d+%d", &a1, &a2);
//printf("a1=%d, a2=%d\n", a1, a2);
printf("%d\n",a1+a2);
fclose(p); }
1.9 stat()
int stat(const char * _Filename, struct stat * _Stat)
函数说明
1.该函数用于获取当前文件的状态
2.第一个参数代表当前文件的完整路径,第二个参数代表包含当前文件状态的结构体指针。
示例代码:
void statFuntionUseDemio(void)
{ struct stat fileStates = {};
struct stat *p = &fileStates;
const char *filePath = "E:\\xp.chen.txt"; stat(filePath,p); _off_t fileSize = fileStates.st_size; // _off_t其实就是long类型
printf("当前这个文件的大小为:%ld\n",fileSize); }
输出结果:
同时通过该函数可以获取文件的其它状态信息(文件大小,最后一次修改时间,文件属性...)
1.10 fwrite()
int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
函数说明
1.该函数用于写二进制数据到文件
2.第一个参数代表待写数据的内存地址
3.第二个参数代表写多少个单位
4.第三个参数代表每个单位的大小
5.第四个参数是fopen返回的文件指针。
示例代码:
void fwriteUseDemo1(void)
{
int array[] = {,,,,,,,,,};
FILE *file = fopen("E:\\xp.chen.data","wb");
fwrite(array,,sizeof(array),file);
fclose(file); }
1.11 fread()
int fread( void *buffer, size_t size, size_t num, FILE *stream );
函数说明
该函数用于读取二进制文件
1.第一个参数代表将要读入的buffer
2.第二个参数代表读多少个单位
3.第三个参数代表每个单位的大小
4.第四个参数代表待读取文件的路径。
示例Demo1:
// 读取二进制文件内容
void freadUseDemo(void)
{ FILE *p = fopen("E:\\xp.chen.data","rb");
while (!feof(p))
{
int a;
int rec = fread(&a,sizeof(a),,p); // 一个单位是1个字节,fread的返回值代表读取了多少个单位,而不是字节
//printf("%d\n",a);
printf("rec=%d,a=%d\n",rec,a);
} fclose(p); }
输出结果:
示例Demo2:
void freadUseDemo1(void)
{
FILE *p = fopen("E:\\xp.chen.data","rb");
while ()
{
int a;
if (fread(&a, , sizeof(a), p) == ) // 当读取的单位数为0的时候结束读取
break;
printf("a = %d\n",a);
} }
输出结果:
示例Demo3:
// 实现文件拷贝
void freadUseDemo2(void)
{ FILE *p1 = fopen("E:\\loginsdk.jar","rb");
FILE *p2 = fopen("E:\\xxx.jar","wb");
if (p1 == NULL)
return;
if (p2 == NULL)
return;
while ()
{
int a;
int rc = fread(&a,,sizeof(a),p1); // rc可以认为是从p1中读取到字节数
if (rc == )
break;
fwrite(&a, , rc, p2); }
fclose(p1);
fclose(p2); }
1.12 fseek()和ftell()
int fseek( FILE *stream, long offset, int origin );
函数说明
1.第一个参数代表fopen打开的文件路径
2.第二个参数代表位移
3.第三个参数代表从什么地方开始
ftell()
long ftell( FILE *stream );
函数说明
1.ftell的功能可以知道指针当前在文件的什么地方
示例代码:
// int fseek( FILE *stream, long offset, int origin );
// 第一个参数代表fopen返回的文件指针
// 第二个参数代表位移
// 第三个参数代表从什么开始
void fseekUseDemo(void)
{ /*char a[10] = {1,2,3,4,5,6,7,8,9,10};
FILE *p = fopen("E:\\xp.chen.dat","wb");
fwrite(&a,1,sizeof(a),p);
fclose(p);*/ char a[];
FILE *p = fopen("E:\\xp.chen.dat", "rb");
// 第一次打开文件的时候,指针位于文件的开始位置
//fseek(p,0,SEEK_SET);// 代表回到起始位置
// fseek(p,-4,SEEK_END); 代表从最后往前移动4个字节
fseek(p,,SEEK_END); // 回到最后位置
fseek(p,,SEEK_SET); // SEEK_SET代表文件开始,这句话的意思就是从文件开始向后移动两个字节
fread(&a,,sizeof(a),p); // 所有的C语言文件读写库函数都会自动维护fopen返回的文件指针
printf("%d,%d\n",a[],a[]); printf("ftell = %ld\n",ftell(p)); // ftell的功能可以知道指针当前在文件的什么地方 // 通过下列方式可以计算出文件大小
// fseek(p,0,SEEK_END); // 先使用SEEK_END将指针移动到文件最后
// ftell(p);//然后使用ftell获得最后的偏移字节数,也就是文件的大小
fclose(p); }
运行结果:
1.13 fflush()
int fflush( FILE *stream );
函数说明
1.fflush函数可以将缓冲区中任何未写入的数据立刻写入文件中
示例代码:
// 由于fflush是实时将缓冲区的内容写入到磁盘,所有不要大量的使用,但
// 如果是特别敏感的数据,可以通过fflush写入磁盘,防止由于电脑各种故障,
// 内存数据丢失
void fflushFunctionUseDemo(void)
{
FILE *p = fopen("E:\\xp.chen.txt","w");
while ()
{
char a[] = {};
scanf("%s",a);
if (strcmp(a, "exit") == )
break;
fputs(a,p);
putc('\n',p);
fflush(p); // fflush函数可以将缓冲区中任何未写入的数据立刻写入文件中
}
fclose(p);
}
运行结果:
1.14 remove()和rename()
void remove( const TYPE &val );
函数说明:
删除文件,参数为文件路径
rename()
int rename( const char *oldfname, const char *newfname );
函数说明:
函数rename()更改文件oldfname的名称为newfname. rename()成功时返回0,错误时返回非零.
示例代码:
void removeFunctionUseDemo(void)
{
//remove("E:\\xp.chen.txt"); // 删除指定文件
rename("E:\\xxx.jar","E:\\nimabi.jar");
}
二.二进制和文本模式的区别
1.在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
3.在windows下,读写文本文件的时候,是不写b的,但读写二进制文件的时候一定要写b,Linux,b是忽略的。
C语言基础(20)-文件操作(fopen,getc,fclose)的更多相关文章
- Go语言基础之文件操作
本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open()函数能够打开一个 ...
- GO学习-(16) Go语言基础之文件操作
Go语言文件操作 本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open( ...
- Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释
上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- C语言样式的文件操作函数
使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...
- python基础篇(文件操作)
Python基础篇(文件操作) 一.初始文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. ...
- Golang基础之文件操作
目录 文件读取 os.open文件读取 os.open循环读取 bufio文件读取 bufio循环读取 ioutil读取整个文件 文件写入 os.OpenFile文件写入 bufio.NewWrite ...
- C语言复习:文件操作
文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁 ...
- SQL语言基础和数据库操作
Sql语言基础: 核心思想:我们自己构造一段查询的代码,然后添加到语句后,从而得到想要的某些数据. Mysql是一种开源数据库 APP Serv:Apache+php+mysql,相当于phpstud ...
随机推荐
- intellij idea android错误: Missing styles. Is the correct theme chosen for this layout?
Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou ...
- Combination Sum IV -- LeetCode
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- [Baltic2003] Gem
[Baltic2003]Gem Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 501 Solved: 320[Submit][Status][Discu ...
- [CF983E]NN country
题意:给一棵树,有许多条巴士线路$(a_i,b_i)$(巴士在路径上每个点都会停车),多次询问从一点到另一点最少要坐多少次巴士 首先dfs一遍预处理出一个点向上坐$2^k$次巴士能到的最浅点,于是我们 ...
- [Contest20180311]朋友
是毒瘤的friends呢~ 注意到“产生感情”和后缀自动机的$Right$集合定义很像,所以先对所有串建广义sam,那么一个节点$s$里的所有串都互相产生感情,而从起点走到$s$走最长路所经过的节点里 ...
- 【floyd】CODEVS 1077 多源最短路
floyd模板 #include<cstdio> #include<algorithm> using namespace std; ][],m,x,y,n; int main( ...
- [POI2001]Peaceful Commission
题目大意: 有n个国家要派代表开会,每个国家有两个代表可供选择. 有m对代表有仇,不能同时开会. 若每个国家只能派一个代表开会,问是否存在一种方案,使得每个国家都能正常参会? 如果有,输出字典序最小的 ...
- C#SerialPort实现串口控制继电器
最近做了一个小系统,麻雀虽小五脏俱全呀,用到各种线程控制,串口控制等技术.其中串口控制最麻烦,因为继电器的响应很快,根据不同的转接口,返回的数据质量是不一样的,所以不能直接wirte,然后马上read ...
- Windows 系统下设置Nodejs NPM全局路径和环境变量配置
在nodejs的安装目录中找到node_modules\npm\.npmrc文件 修改如下即可: prefix = D:\tool\nodejs\node_globalcache = D:\tool\ ...
- DEDECMS爆严重安全漏洞
简要描述: 众所周知,因使用简单.客户群多,织梦CMS一直被爆出许多漏洞.“DEDECMS爆严重安全漏洞,近期官方会发布相关补丁,望大家及时关注补丁动态.” 详细说明: http://www.xx.c ...