文章目录
前言
提示:本文是一篇学习总结,学习的b站小甲鱼的视频,相当于是一种复习吧,文中许多内容都是网课里面的内容,并且是自己的一次写东西的尝试,希望自己可以坚持下去。
提示:以下是本篇文章正文内容,下面案例可供参考
一、文件的概念
1.文件是指一组相关数据的有序集合
通常驻留在外部介质(如磁盘)上
2.文件分类:
1.从用户角度
特殊文件(标准输入输出文件或标准设备文件)
普通文件(磁盘文件)
2.从操作系统角度看
每一个与主机相连的输入、输出设备都可以看做文件 (键盘、显示器)
3.按数据的组织形式
ASCII文件(文本文件)
二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
文本文件便于对字符逐个处理,也便于输出字符。但一般占存储空间较多,且要花费转换时间。
二进制文件节省空间、时间但不是一个字节对应一个字符 ,不能直接输出字符形式。
(两种文件特点相反)
3.(非)缓冲文件系统
一个文件在内存中只有一个缓冲区,向文件输入数据就作为输出缓冲区,从文件输入数据就作为输入缓冲区。
二、文件常用的函数
1.文件的打开与关闭
文件型指针变量
格式:FILE fp;
/*
FILE是个结构体
*/
fp=fopen(文件名,使用文件方式);
“r”:是只读,所以要用这种方式打开文件,该文件必须存在。
“w”:只写不需要存在,没有就创建一个。但是无论是否存在,都会刷新里面的内容。
“a”:所以要是不想刷新文件的内容可以使用追加,但该文件必须存在。
fclose(文件指针);
关闭成功返回0;否则返回EOF(-1)
2.文件的读写
1.字符读写函数 fgetc和fputc
调用: fputc(ch,fp);
功能:将字符ch输入到fp所指的文件中去
说明:
注意fopen的打开方式。
每写入一个字符,文件内部位置指针向后移动一个字节。
成功写入返回写入字符,否则返回EOF。
示例如下(示例):
#include<stdio.h>
#include<stdlib.h>
int main() {
char ch, FileName[20];
FILE* fp;
printf("please put filename you want to write: ");
scanf("%c", FileName);
if (!(fp = fopen(FileName, "wt+"))) {
printf("no open \n");
exit(0); //终止程序
}
printf("please input the sentences you want to write: ");
ch = getchar(); //[^1]接收文件名输入时的回车 否则输入的文本文件最开始有个回车
ch = getchar();
while (ch!=EOF) // EOF 为ASCII编码的结束标志 输入:ctrl+z
{
fputc(ch, fp);
ch = getchar();
}
fclose(fp);
return 0;
}
调用:fgetc(ch,fp);
功能:从fp所指的文件中读取一个字符送入ch中。
注意:
补充:
二进制文件不能用EOF只能用feof()函数
2.字符串读写函数 fgets和fputs
调用:fgets(buffer,n,fp);
功能:从fp所指的文件中读取n-1个字符送入字符数组buffer中,因为在最后加一个‘\0’。
返回值: buffer首地址
调用:fputs(“字符串”,fp);
功能:将字符串写入fp所指的文件中。
返回值:成功返回0;否则返回EOF
补充:
从键盘输入字符串是,用scanf(”%s“,buffer)遇到“空格“就会结束
用fgets(buffer,n,stdin);就可以输入带空格的语句 stdin文件作为键盘输入的缓冲区。
3.数据块读写函数 fread和fwrite
调用:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
参数说明:
buffer:是一个指针。
对fread是输入数据的存放地址;对fwrite是输出数据的地址(均指起始地址)
size:指要读写的字节数。
count:size的个数。
fp:文件型指针。
例子:
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
fwrite(&stu[i], sizeof(student), 1, fp);
fread(&stu[i], sizeof(student), 1, fp) ;
4.格式化读写函数 fscanf和fprintf
调用:
fprintf(文件指针,格式字符串,输出列表);
fscanf(文件指针,格式字符串,输出列表);
例如:
fprintf(fp,"%d,%6.2f",i,t);
fscanf(fp,"%d,%f",&i,&t);
3.fseek和rewind、ftell函数
调用:fseek(文件类型指针,位移量,起始点);
功能:改变文件位置指针
参数:
起始点
例子:
rewind(fp);
将文件内部指针指向文件头
ftell函数
4.出错的检测
ferror函数
cleareer函数
#include<stdio.h>
#include<stdlib.h>
#define SIZE 4
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
void save() {
FILE* fp;
int i;
if (!(fp=fopen("studentlist","wb")))
{
printf("no open /n");
return;
}
for ( i = 0; i < SIZE; i++)
{
if (fwrite(&stu[i], sizeof(student), 1, fp) != 1) {
printf("write error\n");
fclose(fp);
}
}
}
void load() {
FILE* fp;
int i;
if (!(fp = fopen("studentlist", "rb+")))
{
printf("no open /n");
return;
}
for (i = 0; i < SIZE; i++)
{
if (fread(&stu[i], sizeof(student), 1, fp) != 1) {
printf("read error\n");
fclose(fp);
}
}
for (i = 0; i < SIZE; i++)
{
printf("%10s %5d %5d %10s", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr);
}
}
int main() {
int i=1;
printf("please input student information: \n");
for ( i = 0; i < SIZE; i++)
{
scanf("%s,%d,%d,%s", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr);
}
save();
fwrite(&stu[1], sizeof(student), 1, stdout); //与stdin对应 功能是输出到电脑屏幕
/*load();
FILE* fp;
if (!(fp = fopen("studentlist", "r")))
{
printf("no open /n");
exit(0);
}
rewind(fp);
fseek(fp, i * sizeof(student), 0);
student one;
fread(&one, sizeof(student), 1, fp);
printf("%s %d %d %s", &one.name, &one.num, &one.age, &one.addr);*/
return 0;
}
该处使用的url网络请求的数据。
总结
用的很多图片都是直接从网课里截的,第二部分代码目的是体现一些函数的应用。没有语法错误,跟小甲鱼编的也没多少出入。但在我电脑上fread那些函数效果就跟老师有点出入。目前以我的能力还没能解决这些问题 也许这件事会有后续。如果有大佬看到也请指出我的问题 下面是老师总结的一些函数 希望本文对你我都有帮助。