C的文件操作及其函数实例
我们会用到如下的函数
功能 | 函数名 | 适用范围 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输入函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输出流 |
文本行输出函数 | fputs | 说有输入流 |
格式化输入函数 | fscanf | 所有输出流 |
格式化输出函数 | fprintf | 说有输入流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
那么创建一个文件后缀为txt类型的,然后点开你的vs-源文件-添加-现有项-这样就显示了
那么咱们就来写入一个但字符
那么有关FILE的定义如下:
struct _iobuf {
char *_ptr; //指向buffer中第一个未读的字节
int _cnt; //记录剩余的未读字节的个数
char *_base;//文件的缓冲
int _flag;//打开文件的属性
int _file;//获取文件描述
int _charbuf;//单字节的缓冲,即缓冲大小仅为1个字节
int _bufsiz;//记录这个缓冲大小
char *_tmpfname;//临时文件名
};
typedef struct _iobuf FILE;
FILE是一个数据结构,用于访问一个流。每个流都会对应一个FILE结构体。
以及对于一些读和写的操作如下:
“r”:以只读的形式打开文本文件(不存在则出错)
“w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容)
“a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加)
“r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间)
“wb”:以只写的形式打开二进制文件
“rb”:以只读的形式打开二进制文件
“ab”:以追加的形式打开一个二进制文件
“rb+”:以读写的形式打开二进制文件。
“w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失)
“a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读
“wb+”:功能与”w+”相同。只是在读写时,可以由位置函数设置读和写的起始位置
“ab+”:功能与”a+”相同。只是在文件尾部追加数据之后,可以由位置函数设置开始读的起始位置
以上部分引用: 这个博主的C语言文件读写操作(详解)_放码过来呀!!!的博客-CSDN博客_c语言文件读写
在写入之前要明白文件的流程-打开文件-判断-关闭-清空
打开文件和关闭文件要遵循
- filename:文件的路径
- mode:打开模式
那么对于第一个的fputc则遵循:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
FILE* pf=fopen("Example.txt", "w");
if (pf == NULL)
{
//文件失败
printf("%s\n", strerror(errno)); //#include <string.h>和#include <errno.h>对应里边俩
return 0;
}
fputc('A', pf); //写
//但是一次只是读一个
fclose(pf);//值传递
pf == NULL;
return 0;
}
运行之后你会发现,说明你的文件存储进去了
对于那个fgetc而言同样遵循:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
FILE* pf=fopen("Example.txt", "r"); //读
if (pf == NULL)
{
//文件失败
printf("%s\n", strerror(errno)); //#include <string.h>和#include <errno.h>对应里边俩
return 0;
}
printf("%c", fgetc(pf)); //输出
fclose(pf);//值传递
pf == NULL;
return 0;
}
输出的结果是:
因为上边的俩函数都是单字符输出,所以只能一次得到一个。
然后呢就牵涉到了一个输入输出流,以下三个分别相对应。
代码如下:
//头文件依然是一样,这个也是在main函数中zhixing
int ch = fgetc(stdin); //从标准输入流中来读取信息
fputc(ch, stdout); //输出 --但是只是单字节的
FILE* pf = fopen("Example.txt", "w");
if (pf == NULL) {
printf("%s\n", strerror(errno));
return 0;
}
fclose(pf);//关闭文件
pf = NULL;
return 0;
写文件:fputs和那个fgets的要求
的写
FILE* pf = fopen("Example.txt", "w");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//读取成功
fputs("h", pf);
fputs("l", pf);
fputs("l", pf);
fclose(pf);//关闭文件
pf = NULL;
return0 ;
fgets的读:
char buf[1024] = { 0 }; //读文件
FILE* pf = fopen("Example.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
fgets(buf, 1024, pf); //读取行 会发生自动换行的现象
printf("%s", buf);
//可以替换成puts(buf);
fclose(pf);//关闭文件
pf = NULL;
如下
换一种
依旧是fputs,是添加数组的,这样可以输多点的。
char buf[1024] = { 0 }; //读文件
FILE* pf = fopen("Example.txt", "w");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
fputs("hello\n", pf);
fputs("god", pf); //将这些东西存到文件中
fclose(pf);//关闭文件
pf = NULL;
return 0;
运行如图
从键盘上直接的读取
char buf[1024] = { 0 };
fgets(buf, 1024, stdin); //标准输入流
fputs(buf, stdout);//输出标准输出流
***这个和那个gets和puts直接的输出有撒去区别呢,这样不就不经过文件了吗
格式化的形式输入数据 (对照)
#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S{
int n;
float score;
char arr[10];
}
int main()
{
struct S s = {32,2.23f,"zhg"}; //第二个是为了区分的是float
FILE* pf = fopen("Example.txt", "w");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//这个是指写到文件之中 放进去了
fprintf(pf,"%d %.2f %s", s.n, s.score, s.arr);
//
fclose(pf);
pf = NULL;
return 0;
}
运行如图(存入了)
格式化的写
//上边的和上一个代码一样
struct S s = {0};
FILE* pf = fopen("Example.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
fscanf(pf, "%d %f %s", &(s.n), &(s.score), s.arr);
printf("%d %f %s\n", s.n, s.score, s.arr);
fclose(pf);
pf = NULL;
return 0;
输出的形式如下:
最后的最后
//将结构体俩转化为字符串
struct S s = { 100,3.16f,"abcd" };
struct S tmp = { 0 };
char buf[1024] = { 0 };
//将格式化的数据转化成字符串储存在buf中
sprintf(buf, "%d %f %s", s.n, s.score, s.arr);
//printf("%s\n", buf);
//从buf中读取格式化的数据到tmp中
sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), tmp.arr);
printf("%d %f %s\n", tmp.n, tmp.score, tmp.arr);
其实这个复习是写给自己的,里边运用了大量的引用,引用别的博主写的,以及视频上学习的东西,那个b站的学习:c语言编程 C语言入门 c语言(C语言程序设计教程 c语言视频教程 c语言零基础入门教程 学习c语言 c语言视频教程 c语音 C语言教程 C语言编程项目 C语言_哔哩哔哩_bilibili
如果有不对的地方请指正,谢.