文件操作
为什么使用文件
什么是文件
程序文件
数据文件
文件名
文件的打开和关闭
文件指针
只要没打开一个文件就会有一个文件信息区,只要一更改文件信息区也会跟着更改
**FILE *fopen( const char filename, const char mode );
filename 文件名
*char mode 打开方式
w 以写的形式为打开,即使源文件有内容也会清空 文件打开失败返回空指针
int main()
{
FILE* pf = fopen("test.dat", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
文件的顺序读写
int main()
{
FILE* pf = fopen("test.dat", "w");//
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fputc('n', pf);//第一个是内容 第二个是指针
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
fputc('b', stdout);
fputc('i', stdout);
fputc('t', stdout);
return 0;
}//在屏幕上打印bit没有在文件里
读取文件fgetc
如果读取正常返回字符ascii’值 如果失败返回eof
//EOF 他其实就是-1
//使用fgetc从文件流中读取数据
int main()
{
FILE* pf = fopen("test.dat", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件 读出当前文件夹内容
int ret = fgetc(pf);
printf("%c\n", ret);
ret = fgetc(pf);
printf("%c\n", ret);
ret = fgetc(pf);
printf("%c\n", ret);
ret = fgetc(pf);
printf("%c\n", ret);
ret = fgetc(pf);
printf("%c\n", ret);
ret = fgetc(pf);
printf("%c\n", ret);
ret = fgetc(pf);
printf("%c\n", ret);//读取结束或者错误的时候返回-1
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fgetc从标准输入流读取
int main()
{
int ret = fgetc(stdin);
printf("%c\n", ret);
ret = fgetc(stdin);
printf("%c\n", ret);
ret = fgetc(stdin);
printf("%c\n", ret);
return 0;
}
以行的形式
int main()
{
FILE* pf = fopen("test.dat", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件-按照行来写
fputs("abcdef\n", pf);
fputs("qwertyuiop\n", pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
以读的形式
**char *fgets( char string, int n, FILE stream );
第一个读进来放入字符数组
n是读取的最大个数如果是100 实际是99
int main()
{
char arr[10] ={0};
FILE* pf = fopen("test.dat", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
fgets(arr, 4, pf);//实际读了4个最后放了个\0
printf("%s\n", arr);
//下一次读取是从是从上一次未读取完的开始的
fgets(arr, 4, pf);
printf("%s\n", arr);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
格式化输入函数
写文件
int main()
{
struct S s = { "abcdef", 10, 5.5f };
//对格式化的数据进行写文件
FILE*pf = fopen("test.dat", "w");
if (NULL == pf)
{
perror("fopen");
return 1;
}
//写文件
fprintf(pf, "%s %d %f", s.arr, s.num, s.sc);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
如何读出来并且还原结构体
struct S
{
char arr[10];
int num;
float sc;
};
int main()
{
struct S s = {0};
//对格式化的数据进行写文件
FILE* pf = fopen("test.dat", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
//读文件
fscanf(pf, "%s %d %f", s.arr, &(s.num), &(s.sc));//读的数据放在那里。 s. s.
//打印
fprintf(stdout, "%s %d %f\n", s.arr, s.num, s.sc);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
二进制输入
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
void *buffer, 指针你要写哪个数据把地址传过来
size_t size, 元素大小 字节
ize_t count,最多写多少个
//二进制的读写
struct S
{
char arr[10];
int num;
float sc;
};
int main()
{
struct S s = { "abcde", 10, 5.5f };
//二进制的形式写
FILE*pf = fopen("test.dat", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fwrite(&s, sizeof(struct S), 1, pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fread读取
struct S
{
char arr[10];
int num;
float sc;
};
int main()
{
struct S s = {0};
//二进制的形式读
FILE*pf = fopen("test.dat", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
fread(&s, sizeof(struct S), 1, pf);
printf("%s %d %f\n", s.arr, s.num, s.sc);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}