C语言基础知识09---文件操作
目录
文件操作
1.1 文件操作
1.2 文件操作的数据传输形式
1.3 文件操作的分类
1.4 文件存储格式
1.5 文件流指针
1.6 函数名:fopen()
1.7 函数名:fclose()
1.8 函数名:fprintf()
1.9 函数名:fscanf()
1.10 函数名:fseek()
1.11 函数名:feof()
1.12 示例
1.13 练习
1.14 函数名:fwrite()
1.15 函数名:fread()
1.16 函数名:ftell()
1.17 函数名:rewind()
1.18 函数名:fputs()
1.19 函数名:fgets()
1.20 函数名:fputc()
1.21 函数名:fgetc()
1.22 函数名:remove()
文件操作
1.1 文件操作
1.创建、打开文件---默认情况下光标在文件开头,也可以采用追加,光标在文件末尾
2.读写---通过光标进行定位,光标会跟随移动,写入内容只有覆盖模式
3.关闭文件
1.2 文件操作的数据传输形式
数据的写入:从内存到硬盘
数据的读取:从硬盘到内存
1.3 文件操作的分类
基于缓冲区的文件操作---高级IO---基于低级IO实现的函数封装
基于非缓冲区的文件操作---低级IO---Linux系统编程阶段---内核函数
1.4 文件存储格式
Linux文件类型:d - p l s c b
文件后缀:文件的打开方式
文件存储格式:ASSIC码存储、二进制存储
1.5 文件流指针
FILE *fp;
文件打开成功后,fp在后续操作中就代表该文件
1.6 函数名:fopen()
函数原型:FILE *fopen(const char *pathname, const char *mode);
函数功能:打开文件
函数参数:const char *pathname:路径/文件名的字符串
const char *mode:打开方式,填入常量字符串
r 读 打开旧文件
w 写 创建新文件
a 追加 打开旧文件/创建新文件
+ 扩展功能
“r” 只读 “r+” 读写
“w” 只写 “w+” 读写
函数返回值:打开成功,返回文件流指针,打开失败,返回 NULL
函数使用:
FILE *fp = fopen(“./1.txt”, “w+”);
1.7 函数名:fclose()
函数原型:int fclose(FILE *stream);
函数功能:关闭文件
函数参数:FILE *stream:文件流指针
函数返回值:成功返回 0,失败返回 EOF/-1
函数使用:
fclose(fp);
1.8 函数名:fprintf()
函数原型:int fprintf(FILE *stream, const char *format, ...);
函数功能:格式化写入
函数参数:FILE *stream:文件流指针
const char *format, ... :同 printf()
函数返回值:输出的字符个数
函数使用:
fprintf(fp, “hello\n”);
1.9 函数名:fscanf()
函数原型:int fscanf(FILE *stream, const char *format, ...);
函数功能:格式化读取
函数参数:FILE *stream:文件流指针 const char *format, ... :同 scanf()
函数返回值:返回值返回格式控制符获取到的数据个数
函数使用:
1.10 函数名:fseek()
函数原型:int fseek(FILE *stream, long offset, int whence);
函数功能:移动光标
函数参数:FILE *stream:文件流指针
long offset:偏移量 正数向后偏移 负数向前偏移
int whence:基准位置
0 文件开头 SEEK_SET
1 当前位置 SEEK_CUR
2 文件末尾 SEEK_END
函数返回值:成功返回 0,失败返回-1
函数使用:
fseek(fp,0,0);
fseek(fp,-2,2);
1.11 函数名:feof()
函数原型:int feof(FILE *stream);
函数功能:判断光标是否在文件末尾
函数参数:FILE *stream:文件流指针
函数返回值:如果在末尾是非 0,不在末尾是 0
函数使用:
while(a[i]!=0)
while(feof(fp)==0) 判断光标是否在文件末尾
{
fscanf();
}
1.12 示例
#include <stdio.h>
#include <string.h>
int main()
{
char path[30] = {0};
printf("输入文件名:\n");
gets(path);
FILE *fp = fopen(path, "w+");
if(fp == NULL)
{
perror("fopen");
return 0;
}
fprintf(fp, "hello\n");
char a[30] = {0};
scanf("%s", a);
fprintf(fp, "%s\n", a);
//rewind(fp);
fseek(fp, -(strlen(a)+1), SEEK_CUR);
char b[30] = {0};
fscanf(fp, "%s\n", b);
printf("%s\n", b);
char c[30] = {0};
fscanf(fp, "%s\n", c);
printf("%s\n", c);
fclose(fp);
return 0;
}
1.13 练习
1. 向文件 stu.xlsx 中写入几个姓名学号
比如:
张三 1
李四 2
#include <stdio.h>
int main()
{
FILE *fp = fopen("./stu.xlsx", "w");
if(fp == NULL)
{
perror("fopen");
return 0;
}
fprintf(fp, "%s\t%d\n", "张三", 1);
fprintf(fp, "%s\t%d\n", "李四", 2);
fclose(fp);
return 0;
}
2. 从文件中把信息读取出来保存到数组中,然后打印
#include <stdio.h>
struct info{
char name[20];
int id;
};
struct info stu[50];
int main()
{
FILE *fp = fopen("./stu.xlsx", "r");
if(fp == NULL)
{
perror("fopen");
return 0;
}
//rewind(fp);
fseek(fp, 0, 0);
int i = 0;
while(feof(fp) == 0)
{
fscanf(fp, "%s\t%d\n", \
stu[i].name, &stu[i].id);
i++;
}
for(int j=0; j<i; j++)
{
printf("%s\t%d\n", \
stu[j].name, stu[j].id);
}
fclose(fp);
return 0;
}
1.14 函数名:fwrite()
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
函数功能:块写
函数参数:const void *ptr:数据块的起始地址
size_t size:数据块大小
size_t nmemb:数据块数量
FILE *stream:文件流指针
函数返回值:返回写入的块数量
函数使用:
#include <stdio.h>
int main()
{
FILE *fp =fopen("9.txt","w+");
if(fp == NULL)
{
perror("fopen");
return 0;
}
int a[5]={1,2,3,4,5};
fwrite(a,10,2,fp);
fclose(fp);
return 0;
}
1.15 函数名:fread()
函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能:块读
函数参数:const void *ptr:数据块的起始地址
size_t size:数据块大小
size_t nmemb:数据块数量
FILE *stream:文件流指针
函数返回值:返回读取的块数量
函数使用:
#include <stdio.h>
int main()
{
FILE *fp =fopen("9.txt","r+");
if(fp == NULL)
{
perror("fopen");
return 0;
}
fseek(fp,4,SEEK_SET);
int a[5]={0};
fread(a,2,10,fp);
for(int i=0;i<5;i++)
{
printf("%d\n",a[i]);
}
fclose(fp);
return 0;
}
1.16 函数名:ftell()
函数原型:long ftell(FILE *stream);
函数功能:用于定位光标当前所在位置
函数参数:FILE *stream:文件流指针
函数返回值:返回光标当前所在位置(距离文件开头的字节数)
函数使用:
ftell(fp);
1.17 函数名:rewind()
函数原型:void rewind(FILE *stream);
函数功能:把光标移动到文件开头
函数参数:FILE *stream:文件流指针
函数返回值:无
函数使用:
rewind(fp); == fseek(fp,0,0);
1.18 函数名:fputs()
函数原型:int fputs(const char *s, FILE *stream);
函数功能:向文件写入一个字符串
函数参数:const char *s:字符串首地址
FILE *stream:文件流指针
函数返回值:字符串的字符个数
函数使用:
1.19 函数名:fgets()
函数原型:char *fgets(char *s, int size, FILE *stream);
函数功能:从文件读取 size-1 个字符,字符串形式
函数参数:char *s:字符串保存的位置
int size:读取的字符个数(因为是获取字符串,所以会消耗一个空间保存’\0’)
FILE *stream:文件流指针
函数返回值:成功返回 s 的值
函数使用:
#include <stdio.h>
int main()
{
FILE *fp =fopen("10.txt","w+");
if(fp == NULL)
{
perror("fopen");
return 0;
}
char a[10]="hello";
fputs(a,fp);
char buff[10]={0};
rewind(fp);
fgets(buff,6,fp);
puts(buff);
char b[30]={0};
fgets(b,30,stdin);
fputs(b,stdout);
fclose(fp);
return 0;
}
1.20 函数名:fputc()
函数原型:int fputc(int c, FILE *stream);
1.21 函数名:fgetc()
函数原型:int fgetc(FILE *stream);
1.22 函数名:remove()
函数原型:int remove(const char *pathname);
函数功能:删除文件