一、整体操作步骤
1.打开文件:fopen
2.读写文件:
fgetc/fputc :单个字符的输入输出,输入输出为ASCII码文件
fgets/fputs: 字符串的输入输出,输入输出为ASCII码文件
fread/fwrite 二进制数据的输入输出 ,输入输出为二进制文件/ASCII码文件
fscanf/fprintf:格式化字符串的输入输出,输入输出为ASCII码文件
3.关闭文件:fclose
二、fopen/fclose
fopen:
①函数原型:FILE *fopen(const char *pathname, const char *mode);
②功能:打开一个文件并与之建立交流
③参数:
pathname:打开文件的路径
mode:打开文件的方式
"r"只读
文件不存在—报错
文件存在—只读打开
"r+"
文件不存在—报错
文件存在—读写打开
"w"
文件不存在—创建,将所输入的内容填写到文件中
文件存在—内容全部清零,只读方式打开
"w+"
文件不存在—创建,将所输入的内容填写到文件中
文件存在—内容全部清零,读写方式打开
"a"
文件不存在—创建,将所输入的内容填写到文件中
文件存在—打开后面跟着直接写
"a+"
文件不存在—创建,将所输入的内容填写到文件中
文件存在—打开后面跟着直接读写
④返回值:成功返回FILE类型指针,失败返回NULL
eg:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp =NULL;
fp = fopen("a.txt","w");//只读的方式打开
if (fp ==NULL)
{
perror("faile to open");
return -1;
}
fputs("hello world",fp);//向文件输入"hello world"
fclose(fp);
return 0;
}输入结果:创建了一个a.txt,内容"hello world"

fclose:
①函数原型:int fclose(FILE *stream);
②功能: 关闭流
③参数:stream:流
④返回值:成功返回0,失败返回EOF(-1)
fclose(fp)fopen打开的文件,最后要用fclose关闭,否则会出现内存泄漏
三、fputc/fgetc
fputc:
①函数原型:int fputc(int c, FILE *stream);
②功能:将c对应的字符ASCII码值写入流中
③参数:c为字符的ASCII码值,stream为文件流指针
④返回值:成功返回输入字符的ASCII码值,失败返回EOF
eg:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp =NULL;
fp = fopen("a.txt","w");
if (fp ==NULL)
{
perror("faile to open");
return -1;
}
fputc('h',fp);
fputc('o',fp);
fputc('w',fp);
fputc(' ',fp);
fputc('a',fp);
fputc('r',fp);
fputc('e',fp);
fputc(' ',fp);
fputc('y',fp);
fputc('o',fp);
fputc('u',fp);
fclose(fp);
return 0;
}输入结果:

fgetc:
①函数原型:int fgetc(FILE *stream);
②功能:从流中获得一个字符
③参数:stream为文件指针流
④返回值:成功读取字符的ASCII码值,失败或者读到末尾返回EOF
eg:读取上一个a.txt文件内容"how are you"
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp =NULL;
char ch = 0;
fp = fopen("a.txt","r");//注意:是r 只读模式
if (fp ==NULL)
{
perror("faile to open");
return -1;
}
while(1)//字符的遍历,进行循环检查文件a.txt是否读完
{
ch = fgetc(fp);
if( EOF == ch ) //如果没有字符EOF,则跳出循环
{
break;
}
printf("%c\n",ch);//输出所读到的字符
}
fclose(fp);
return 0;
}输出结果:

四、fputs/fgets
fputs:
①函数原型: int fputs(const char *s, FILE *stream);
②功能:s指向的字符串写入流中,不包含/0字符
③参数:s:要写入字符串的首地址 stream:文件流指针
④返回值:成功返回非负数,失败返回EOF
eg:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp =NULL;
char ch = 0;
char a[32] = {"what are you doing"};
fp = fopen("a.txt","w");
if (fp ==NULL)
{
perror("faile to open");
return -1;
}
fputs("hello world",fp);
fputs(a,fp);
fclose(fp);
return 0;
}输入结果:

fgets:
①函数原型:char *fgets(char *s, int size, FILE *stream);
②功能:向流中输入字符串
③参数:s:存放字符串空间首地址 size:最多存放字符串的个数 stream:文件流指针
④返回值:成功返回存放字符串空间的首地址,失败或读到文件末尾返回NULL
⑤注意:
1.fgets最多读取一行字符串
2.fgets想要读取的字符串<这一行字符串长度,会读取前size-1个字符
3.fgets会存储\n字符
4.fgets会在最末尾补\0
eg:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp =NULL;
char *p = NULL;
char ch[32] = {0};
fp = fopen("a.txt","r");
if (NULL == fp )
{
perror("faile to open");
return -1;
}
while (1)
{
p = fgets(ch,sizeof(ch),fp);
if(NULL == p)
{
break ;
}
printf("%s\n",ch);
}
fclose(fp);
return 0;
}输出结果(提前创建a.txt其内容为 hello world clear):

五、fread/fwrite
fread:
①函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
②功能:从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中
③参数:ptr:存放对象存放空间的首地址 size:读取对象的字节数 nmemb:读取对象的个数
stream:文件流指针
④返回值:成功返回实际读到对象的个数,失败或读到文件末尾返回0
eg:(对应fwrite eg2的例子)
#include <stdio.h>
typedef struct student
{
char name[32];
char sex;
int age;
int score;
}stu_t;
int main(int argc, char const *argv[])
{
FILE *fp = NULL;
stu_t s;
stu_t stu[5];
size_t ret = 0;
int i = 0;
fp = fopen("a.txt", "r");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
ret = fread(&s, sizeof(stu_t), 1, fp);
printf("==============================\n");
printf("ret = %ld\n", ret);
printf("姓名:%s\n", s.name);
printf("性别:%c\n", s.sex);
printf("年龄:%d\n", s.age);
printf("成绩:%d\n", s.score);
ret = fread(stu, sizeof(stu_t), 5, fp);
printf("==============================\n");
printf("ret = %ld\n", ret);
for (i = 0; i < ret; i++)
{
printf("姓名:%s\n", stu[i].name);
printf("性别:%c\n", stu[i].sex);
printf("年龄:%d\n", stu[i].age);
printf("成绩:%d\n", stu[i].score);
}
printf("==============================\n");
ret = fread(stu, sizeof(stu_t), 5, fp);
printf("ret = %ld\n", ret);
fclose(fp);
return 0;
}输出结果:

fwrite:
①函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
②功能:向流中写入nmemb个对象,每个对象size个字节,写入数据存放在ptr所指向的空间中
③参数:ptr:写入对象存放空间的首地址 size:写入对象的字节数 nmemb:写入对象的个数
stream:文件流指针
④返回值:成功返回写入对象的个数,失败返回0
eg1:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp = NULL;
char ch[11] = {"hello world"};
char *x = NULL;
x =ch;
fp = fopen("a.txt","w");
if(fp == NULL)
{
perror("fail to open");
return -1;
}
fwrite(x,sizeof(ch),1,fp);
fclose(fp);
return 0;
}输入结果:

eg2:
#include <stdio.h>
typedef struct student
{
char name[32];
char sex;
int age;
int score;
}stu_t;
int main(int argc, char const *argv[])
{
FILE *fp = NULL;
stu_t s = {"zhangsan", 'm', 19, 100};
stu_t stu[3] = {
{"zhangsan", 'm', 18, 90},
{"lisi", 'f', 19, 85},
{"wanger", 'm', 16, 70},
};
fp = fopen("a.txt", "w");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
fwrite(&s, sizeof(s), 1, fp);
fwrite(stu, sizeof(stu_t), 3, fp);
fclose(fp);
return 0;
}输入结果:

六、fscanf/fprintf
fscanf:
①函数原型:int fscanf(FILE *stream, const char *format, ...);
②功能:从流中接收格式化字符串
③参数:stream:文件流指针 format:接收数据格式 ...:存放数据对应的变量空间
④返回值:正常返回匹配到的输入控制符的个数,出错或读到文件末尾返回EOF
eg:
提前创建a.txt,并输入a=100,b=200

输入代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp =NULL;
int num1 = 0;
int num2 = 0;
fp = fopen("a.txt","r");
if (fp ==NULL)
{
perror("faile to open");
return -1;
}
fscanf(fp, "a=%d, b=%d", &num1, &num2);
printf("num1=%d\n",num1);
printf("num2=%d\n",num2);
fclose(fp);
return 0;
}输出结果:

fprintf:
①函数原型:int fprintf(FILE *stream, const char *format, ...);
②功能:将格式化字符串写入流中
③参数:stream:文件流指针 format:写入文件中数据的格式 ...:对应的变量
④返回值:成功返回打印字节数,失败返回负数
eg:
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp =NULL;
char *p = NULL;
int a = 100;
int b = 200;
fp = fopen("a.txt","w");
if (fp ==NULL)
{
perror("faile to open");
return -1;
}
fprintf(fp,"hello world\n");
fprintf(fp,"a= %d b = %d a+b = %d ",a,b,a+b);
fclose(fp);
return 0;
}输入结果:

C语言文件操作详解:fopen,fclose及常用函数
该文详细介绍了C语言中对文件进行读写操作的基本函数,包括fopen用于打开文件,fclose用于关闭文件,fputc/fgetc用于字符输入输出,fputs/fgets用于字符串输入输出,fread/fwrite用于二进制数据的读写,以及fscanf/fprintf用于格式化字符串的读写。文章通过示例代码阐述了各函数的使用方法和参数含义。
936

被折叠的 条评论
为什么被折叠?



