C语言之文件操作
文件是由文件路径+文件主干+文件后缀组成的。文件又被分为文本文件和二进制文件,两种区别就在于文本文件是给人看的,二进制文件是给机器看的,该文章主要说明了对一个文件的操作,是一个文件就会用于存放数据,将文件中的信息输入输出也是我们要掌握的。C语言的文件操作,是用于用户保存信息,和整理信息的一种方法,可以让不想被销毁的信息保留到下次打开可执行程序里面还有之前的内容。
如何把信息放入文件呢?
我们知道把一个大象放进冰箱只需要三步!打开冰箱门,把大象放进去,关闭冰箱门。当然我们操作文件也是如此,要先打开文件。
打开文件函数:fopen
可见这个函数的功能就是打开一个文件,前面是文件名,后面是打开方式,注意,写入时都需要用双引号引起来,打开方式有很多种,你可以选择自己想要的方式,在我们确定好自己的打开方式后,必须创建一个文件指针(FILE*)来接收。
打开方式 | 含义 | 如果没有该文件->执行操作 |
---|
“w” | 写入一个文本文件 | 自动创建一个文件 | “r” | 读一个文本文件 | 返回一个空指针 | “a” | 在文件末尾追加数据 | 返回一个空指针 | “wb” | 以二进制的方法写入一个文件 | 自动创建一个文件 | “rb” | 以二进制的方法读入一个文件 | 返回一个空指针 | “ab” | 以二进制的方法在文件末尾追加 | 返回一个空指针 | “r+” | 可读可写,操作一个文本文件 | 返回一个空指针 | “w+ | 可读可写,建立一个新文件 | 自动创建一个新文件 | ”a+“ | 可读可写,在文件末尾进行读写 | 自动创建一个新文件 | ”rb+“ | 可读可写,操作一个二进制文件 | 返回一个空指针 | ”wb+“ | 可读可写,新建立一个二进制文件 | 自动创建一个新文件 | ”ab+“ | 可读可写,在二进制文件末尾进行读写 | 自动创建一个新文件 |
这里的打开文件方式多种多样,但是聪明的你是不是发现了,只要带上w都可以自动创建一个不存在的文件,而一般带上r如果1读取错误会立马返回空指针。
我们了解了打开方式接下来就可以尝试打开文件输入数据了。
FILE* pf=fopen("test.txt",'w');
可以看见文件被创建了,不过要注意,我们在创建后应该判断一下再继续操作,否则创建失败,还输入数据会发生错误!!!
这里我们看见了一个关闭文件函数。
关闭文件函数:fclose
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(
只需要将已经打开的文件指针传入文件关闭函数即可。
这里我们要介绍很多种输入输出方式,比如我们常用的scanf,printf,也是其中一种常用的输入流和输出流,这两个函数在这里就不加赘述。
函数名称 | 函数功能 | 作用 |
---|
fgetc | 字符输入函数 | 所有输出流 | fputc | 字符输出函数 | 所有输入流 | fgets | 文本行(字符串)输入函数 | 所有输出流 | fputs | 文本行(字符串)输出函数 | 所有输入流 | fscanf | 格式化输入函数 | 所有输出流 | fprintf | 格式化输出函数 | 所有输入流 | fread | 从文件中读取数据 | 文件 | fwrite | 将数据写入文件 | 文件 |
以上就是我们可以进行对文件操作的一些函数,那他们有什么区别和不同,要分外留意最后两个函数他们只针对于文件输出流和文件输入流而存在的,我们首先要明白对于输入流和输出流的打开方式是不一样的!
fgetc和fputc(字符输入输出流)
观察两个函数的参数就可以明白,fgetc是在FILE*指向的流的一个指针,可以用于判断字符结束标志,fgetc的返回值是int型,如果文件中还有字符返回int型,如果没有字符返回EOF,我们知道EOF在C语言中代表的是-1。
fputc是将字符c输出到文件stream,一次只能输入一个字符,打开创建的文件即可看到。
fgets和fputs(字符串输入输出流)
观察函数参数可以发现!这两个函数几乎参数一模一样,不过他们的作用可是完全不一样!
fgets函数是把文件指针指向的文件里的num个数据,以字符串的形式获取然后输入到str中。 fputs函数是将str字符串,输出到文件中。
实际应用例子:
这里的fgets还可以用于判断文件是否结束,文件没有结束会返回一个字符串,文件结束会返回NULL(空指针)。
具体代码:
int main()
{
FILE* pf = fopen("text.txt", "w");
if (pf == NULL)
{
return 0;
}
char arr[10] = { 0 };
fputs("hello world!", pf);
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
return 0;
}
char arr[20] = { 0 };
fgets(arr,20, pf);
puts(arr);
fclose(pf);
pf = NULL;
return 0;
}
fprintf和fscanf(格式化输出输入流)
其实该函数与我们常用的printf和scanf只是多了一个参数,就是文件指针,我们可以利用这两个函数来用结构体做一个示例。
首先创建一个结构体
struct Stu {
char name[20];
int age;
char class[10];
int score;
};
函数使用时要注意文件打开方式,这里我用的都是一般打开方式,读写的方法不同,里面的内容也会有所差异。
运行代码:
int main()
{
FILE* pf = fopen("text.txt", "w");
if (pf == NULL)
{
return 0;
}
struct Stu arr = { "张三",18,"2022",81 };
fprintf(pf, "%s %d %s %d", arr.name, arr.age, arr.class, arr.score);
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
return 0;
}
struct Stu arr = { 0 };
fscanf(pf, "%s %d %s %d", arr.name, &(arr.age), arr.class, &(arr.score));
printf("%s %d %s %d", arr.name, arr.age, arr.class, arr.score);
fclose(pf);
pf = NULL;
return 0;
}
这里的文件格式会影响读取格式所以要千万按照正确格式来填写。
fwrite和fread(文件输入输出流)
fwrite函数是将指针中指向的size字节大小,count个,数据写入FILE*指向的文件。
fread函数是将文件中,ize字节大小,count个数据读到ptr指针指向的区域。
一个从头到尾,一个从尾到头。
接下来看看如何使用该函数。
代码如下
int main()
{
FILE* pf = fopen("text.txt", "wb");
if (pf == NULL)
{
return 0;
}
struct Stu arr[10] = {{"张三",18,"2022\n",81},
{"李四",21,"2020",92},
{"王五",20,"2021",86}};
fwrite(arr, sizeof(struct Stu), 3, pf);
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
FILE* pf = fopen("text.txt", "rb");
if (pf == NULL)
{
return 0;
}
struct Stu buff[10] = { 0 };
fread(buff, sizeof(struct Stu), 3, pf);
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%s %d %s %d\n", buff[i].name, buff[i].age, buff[i].class, buff[i].score);
}
fclose(pf);
pf = NULL;
return 0;
}
这里提到了将数据换行,在结构体中把班级和分数交换一下位置,在班级后面添加一个换行符即可。但是前者有点麻烦,一改全部要改,把数据全部改了确实有点繁琐,所以这里我们可以在打印时后面添加换行符或者在结构体中增加一个字符串,专门用于存放换行符,如果有更好的想法,欢迎提出!该文章分享就到这里,感谢观看!
|