目录
文件:
什么是文件
程序文件:
数据文件
文件操作理解:
文件名
文件的打开和关闭
文件指针
文件的打开和关闭
文件的使用方式:
文件的读写:
编辑
fputc
编辑fgetc
fputs
fgets
perror
fprintf
编辑
fscanf
编辑
流:
fwrite
fread
对比函数:
sscanf
sprintf
文件的随机读写
fseek
ftell
rewind
磁盘上的文件是文件。
源文件,目标文件和可执行程序是程序文件。
文件的内容是程序运行时读写的数据。
文件操作就是在程序中对硬盘上的文件进行写(输出)和读(输入)。
文件操作:我们通过文件指针找到对应文件信息,并对文件进行处理
文件名的组成:文件路径加上文件名。
当打开一个文件时,硬盘上的文件会在内存中开辟对应的文件信息区,文件信息区存储的是该文件的数据,文件信息区定义形如:
struct _iobuf{
char* _ptr;
int _cnt;
char*_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
};
typedef struct _iobuf FILE;
一个结构体,上面存储了该文件的全部数据和信息。
这个结构体类型是FILE。
结构体指针就是FILE*,指向该文件信息区。
我们通过文件指针FILE*可以找到对应文件完成文件操作。
fopen:打开文件
以什么方式打开哪一个文件。
fclose:关闭文件
#include
#include
#include
int main()
{
FILE*pf = fopen("test.txt", "r");//以读的形式打开文件test.txt
if (pf == NULL)//文件读取失败时返回空指针
{
printf("%s\n", strerror(errno));//打印错误信息
return 1;
}
//...
//读文件
fclose(pf);//关闭文件
pf = NULL;//防止后续操作对文件指针进行修改。
return 0;
}
读取文件时,文件必须存在。
读取其他路径下的文件:
FILE*pf = fopen("C:\\Users\\13902\\Desktop", "r");//读其他路径下的文件需要加上'\'进行传义
表示把字符写入到文件流中去。
从文件中读取一个字符。
int main()
{
FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
if (pf == NULL)//文件读取失败时返回空指针
{
printf("%s\n", strerror(errno));//打印错误信息
return 1;
}
//...
//读文件
/*char i = 0;
for (i = 'a'; i <'z'; i++)
{
fputc(i, pf);
}*/
char ch = fgetc(pf);
cout << ch << endl;
fclose(pf);//关闭文件
pf = NULL;//防止后续操作对文件指针进行修改。
return 0;
}
fgetc函数表示从文件中读取一个字符,读取成功时,返回该字符,读取失败是,返回EOF。
写一行数据到文件中。
int main()
{
FILE*pf = fopen("test.txt", "w");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
//...
//读文件
/*char i = 0;
for (i = 'a'; i <'z'; i++)
{
fputc(i, pf);
}*/
/*char ch = fgetc(pf);
cout << ch << endl;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}*/
fputs("zhanmusi ", pf);
fclose(pf);
pf = NULL;
return 0;
}
从文件中读一行数据。
int main()
{
FILE*pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
//...
//读文件
/*char i = 0;
for (i = 'a'; i <'z'; i++)
{
fputc(i, pf);
}*/
/*char ch = fgetc(pf);
cout << ch << endl;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}*/
char arr[20] = { 0 };
fgets(arr, 20, pf);
cout << arr << endl;
fclose(pf);
pf = NULL;
return 0;
}
代替strerror,作用是打印错误信息。
写格式化数据到文件。
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan", 25, 50 };
FILE*pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fprintf(pf,"%s %d %f",s.arr,s.age,s.score);
fclose(pf);
pf = NULL;
return 0;
}
表示从文件中读取格式化数据
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { 0 };
FILE*pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);
fclose(pf);
pf = NULL;
return 0;
}
流是实现内存向不同外设输入数据时因外设的输入方式不同而创建的,类比接口。
我们只需要把内存中的数据输入给流,流来自动把数据输出给外设。
把数据以二进位制形式写到文件。
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan", 25, 50 };
FILE*pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
/*fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);
fprintf(stdout, "%s %d %f", s.arr, s.age, s.score);*/
fwrite(&s, sizeof(s), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
从文件中以二进位制的形式读取。
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { };
FILE*pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
/*fscanf(pf, "%s %d %f", s.arr, &s.age, &s.score);
fprintf(stdout, "%s %d %f", s.arr, s.age, s.score);*/
/*fwrite(&s, sizeof(s), 1, pf);*/
fread(&s, sizeof(s), 1, pf);
printf("%s %d %f", s.arr, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
从字符串中读格式化数据。
本质上是把字符串转换为格式化数据
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan", 25, 50 };
struct S tmp = { 0 };
char arr[100] = { 0 };
sprintf(arr, "%s %d %f", s.arr, s.age, s.score);
sscanf(arr, "%s %d %f", tmp.arr, &tmp.age, &tmp.score);
/*cout << tmp << endl;*/
printf("%s %d %f", tmp.arr, tmp.age, tmp.score);
/*cout << arr << endl;*/
return 0;
}
写格式化数据到字符串(把格式化数据转换为字符串)
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan", 25, 50 };
char arr[100] = { 0 };
sprintf(arr, "%s %d %f", s.arr, s.age, s.score);
cout << arr << endl;
return 0;
}
根据文件指针的位置和偏移量来定位文件指针。
orign有三个取值,分别代表开头,目前,末尾。
int main()
{
FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
if (pf == NULL)//文件读取失败时返回空指针
{
printf("%s\n", strerror(errno));//打印错误信息
return 1;
}
//...
//读文件
/*char i = 0;
for (i = 'a'; i <'z'; i++)
{
fputc(i, pf);
}*/
fseek(pf, 2, SEEK_SET);
char ch = fgetc(pf);
cout << ch << endl;
fclose(pf);//关闭文件
pf = NULL;//防止后续操作对文件指针进行修改。
return 0;
}
返回文件指针相对于起始位置的偏移量。
int main()
{
FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
if (pf == NULL)//文件读取失败时返回空指针
{
printf("%s\n", strerror(errno));//打印错误信息
return 1;
}
//...
//读文件
/*char i = 0;
for (i = 'a'; i <'z'; i++)
{
fputc(i, pf);
}*/
fseek(pf, 2, SEEK_SET);
/*char ch = fgetc(pf);
cout << ch << endl;*/
int a = ftell(pf);
cout << a << endl;
fclose(pf);//关闭文件
pf = NULL;//防止后续操作对文件指针进行修改。
return 0;
}
让文件指针的位置回到起始位置。
int main()
{
FILE*pf = fopen("test.txt", "r");//读其他路径下的文件需要加上'\'进行传义
if (pf == NULL)//文件读取失败时返回空指针
{
printf("%s\n", strerror(errno));//打印错误信息
return 1;
}
//...
//读文件
/*char i = 0;
for (i = 'a'; i <'z'; i++)
{
fputc(i, pf);
}*/
fseek(pf, 2, SEEK_SET);
/*char ch = fgetc(pf);
cout << ch << endl;*/
int a = ftell(pf);
cout << a << endl;
rewind(pf);
char ch = fgetc(pf);
cout << ch;
fclose(pf);//关闭文件
pf = NULL;//防止后续操作对文件指针进行修改。
return 0;
}