life is cat,coffee,and create
目录
前言
始终觉得,听懂只是了解,能讲述才是掌握
一篇文章带你搞定c语言文件操作,应付考试没问题√
一、文件的存储
文件地址大家应该很熟悉了,但也丢个图以表示教程的完整-w-
需要注意到的是,数据文件在内存中的存储形式有两种,分别是ASCⅡ文件与二进制形式文件,这在之后会用到。
二、C中对文件操作的基本示例
1.最简单的示例
再多嘴一句,这个教程是最最最基本的文件操作~
先来看一个最基本的示例
void main()
{
FILE* f;
f = fopen("reademe.txt", "wb");
fflush(f);
fclose(f);
return;
}
简单说明下。首先获取了文件指针,然后将指针通过fopen函数进行文件地址的获取,并且指定操作模式“wb”,同时打开文件;fflush是用来清理缓存的,具体作用可以不用管,但在大型项目中需要小心使用,具体用法可以参考别的文章,这里就记住在关闭文件前fflush一下是个好习惯就行。然后fclose,显而易见,就是关闭文件,虽然不关闭随着程序的结束也会自动关闭,但为了完整还是建议加上。
然后你把代码复制了,运行发现...编译不通过!
这个问题很常见了,是新旧版本c语言自带库函数变更导致的,当然有很多种方法解决,这里给出最简单的方法:在程序最上面加上这句...
#define _CRT_SECURE_NO_DEPRECATE
然后运行,编译通过,发现我们的文件目录下多了这个
reademe,txt 这是因为我们在打开文件时没有在同目录下找到这个文件,于是自动帮我们创建了
当然我们也可以在不同目录下试一试
f = fopen("E:/C语言/ct-1/reademe.txt", "wb");
运行,发现在该目录下出现reademe
如果我们不用旧版函数,用提示中建议使用的 fopen_s呢?很明显,所需的参数不同,应改成如下
void main()
{
FILE* f;
errno_t err;
err = fopen_s(&f,"E:/C语言/ct-1/reademe.txt", "wb");
fflush(f);
fclose(f);
return;
}
简单说下这里。fopen返回的是一个文件指针,所以直接赋值拿来用;而fopen_s返回的是一个值,打开文件成功返回0,失败返回非0。在参数中传入了要赋值的指针,并直接访问其地址。、
这就是最简单应用。同理之后也会涉及到有些函数的不安全问题,这里只就旧版函数进行讨论
三、常用的一些文件操作函数
1.fopen()
fopen()这个函数接收两个参数,
分别是文件名,操作模式。用一个文件指针接受。
FILE* f;
f = fopen("reademe.txt", "mode");
操作模式如下:
注意这里提到的输入指的是往内存里输入,或者说是程序里,输出是指往磁盘里输出。
2.fprintf()与 fscanf()
这两个其实是对于文件的格式化输入与读取,
这个函数用于往打开的文件里面写入数据。如下示例:
分别是文件指针,输入格式,以及输入的东西。
void main()
{
FILE* f;
f = fopen("E:/C语言/ct-1/reademe.txt", "wb");
fprintf(f, "%s", "hellowfiles");
fflush(f);
fclose(f);
return;
}
运行后
fscanf()
看这个例子
void main()
{
FILE* f;
f = fopen("E:/C语言/ct-1/reademe.txt", "w+");
fputs("Life is cat and code",f);
char str1[10], str2[10], str3[10], str4[10], str5[10];
//rewind(f);
fscanf(f,"%s %s %s %s %s", str1, str2, str3, str4, str5);
printf("1:%s\n", str1);
printf("2:%s\n", str2);
printf("3:%s\n", str3);
printf("4:%s\n", str4);
printf("5:%s\n", str5);
fflush(f);
fclose(f);
return;
}
这个例子中,我们在文件中写入了一句话,然后以格式化的形式进行了输出。然鹅你复制了...又不对!这个问题在于随着写入,文件内部的指针移动了最后,这时我们再想从头读取肯定是不对的,我们需要对这个指针进行移动。只需要把上面代码里面藏得小注释该回去就行啦!有关rewind()这个我们后面说到文件内指针的时候再讲。
运行后:
3.fputc()与fgetc()
这俩函数是读写一个字符的函数
先说fputc()
举个例子
void main()
{
FILE* f;
f = fopen("E:/C语言/ct-1/reademe.txt", "w");
char c = getchar();
while (c != '#')
{
fputc(c, f);
putchar(c);
c = getchar();
}
fflush(f);
fclose(f);
return;
}
这个例子可以让我们随意往文件里输入字符,直到出现#。这里就可以很明显的理解fputc和putchar的区别,一个是往文件里丢,一个是往命令行上丢。
再来说fgetc()
void main()
{
FILE* f;
f = fopen("E:/C语言/ct-1/reademe.txt", "r");
while ( !(feof(f)))
{
char ch = fgetc(f);
putchar(ch);
}
fflush(f);
fclose(f);
return;
}
这个例子里,我们对上面写入的redeme进行了读取,并且打印在命令行上。也就是说fgetc()能将该文件里的数据一个一个一个的读取。
这里我们还用到了feof()这个函数,是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0
4. fgets()与fputs()
这俩函数是读写一个 字符串的函数
5.写入与读取二进制文件
使用fwrite()与 fread()写入与读取二进制文件
void main()
{
FILE* f;
f = fopen("test.data", "w+");
int i = 12;
fwrite(&i, sizeof(int), 1,f);
fflush(f);
fclose(f);
i = 1000;
f = fopen("test.data", "r");
fread(&i, sizeof(int), 1, f);
printf("i = %d\n", i);
fflush(f);
fclose(f);
return;
}
第一个参数是指向要被写入的元素数组的指针; 第二个要被写入的每个元素的大小,以字节为单位;第三个是元素的个数,每个元素的大小为 size 字节;第四个是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
6. 任意顺序的操作
首先要清楚,这里说的数据文件都是txt的文本格式,可以抽象的理解为当我们访问时会有一个文件指针:
每个方格里都会存放一个字符
这个指针其实就是我们一开始
FILE* f;
f = fopen("test.data", "w+");
所生成的指针,这个指针一开始会在文件头的位置。
我们有fseek()来对文件指针进行操作
举个菜鸟教程上的栗子:
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("file.txt","w+");
fputs("This is runoob.com", fp);
fseek( fp, 7, SEEK_SET );
fputs(" C Programming Langauge", fp);
fclose(fp);
return(0);
}
This is C Programming Langauge
这里面使用了常量,对照表如下:
总结
okk,以上就是关于文件的基本操作内容了,跟着敲一遍掌握应该是没问题的~
都是一些最最基础的应用希望能对你有所帮助
✪ ω ✪