前言:在C语言中我们创捷数据都是在内存上面,一旦程序结束数据就会流失。为了把我们想要保存的数据保存下来,我们可以考虑把数据储存在磁盘中,也就是存在硬盘里,因此,接下来介绍文件操作函数来实现储存数据在磁盘上面。
1.打开文件
首先我们得学会打开文件和创造一个文件,这里用到的是fopen函数
FILE *fopen(const char *filename, const char *mode)
filename是文件名称,mode是打开方式,以下是打开方式的列表
没错,如果文件并不存在,一些打开方式会自动帮你创建文件。
FILE* p = fopen("test3_29.txt", "rb");
if (p == NULL)
{
perror("fopen");
return 1;
需要注意的是,如果fopen函数打开文件出错会返回NULL,因此需要做一个判断,如果返回出错,则会打印出错原因以及提前结束程序。
2.输入数据
功能 | 函数 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输入 | fwirite | 文件 |
以fputs函数为例
int fputs(const char *str, FILE *stream)
int main()
{
FILE* pf = fopen("test4_1.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("如果真爱有颜色,那一定是蓝色",pf);
fclose(pf);
pf = NULL;
return 0;
}
然后打开文件即可看到输入的内容
但是值得注意的是,如果使用改程序再次输入新的内容会覆盖原来的文本
int main()
{
FILE* pf = fopen("test4_1.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("如果真爱有颜色,那一定是绿色",pf);
fclose(pf);
pf = NULL;
return 0;
}
因此,如果是想要往文本里面追加内容,需要使用其他的打开方式。例如"a"
int main()
{
FILE* pf = fopen("test4_1.txt", "a");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("我永远喜欢蕾姆",pf);
fclose(pf);
pf = NULL;
return 0;
}
如果想要实现换行输入的话只需输入\n即可
int main()
{
FILE* pf = fopen("test4_1.txt", "a");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("\n大家都喜欢蕾姆",pf);
fclose(pf);
pf = NULL;
return 0;
}
3.读取数据
char *fgets(char *str, int n, FILE *stream)
str表示内容读取成功后所要放到的空间,n表示读取的字节数字,stream就是流(下面的例子中是文件)
int main()
{
FILE* pf = fopen("test4_1.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
char arr[100] = { 0 };
fgets(arr,100,pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
return 0;
}
但是该种方法只能读取一行数据,要想读取整个文件的数据要用fread函数
4.关闭文件
当我们写入和读取结束后就要关闭文件
flclose(pf);
pf=NULL;
同时注意要把文件FILE类型的指针置空,以防其成为野指针。
5.文件位置指针函数
ftell函数
long int ftell(FILE *stream)
该函数返回的是一个文件位置指针的long int类型的数字
int main()
{
FILE* pf = fopen("test4_2.txt", "w");
printf("%d", ftell(pf));
return 0;
}
这里我们只是打开了一个文件,并没有输入任何数据,也就是说文件中为空的文本,此时返回值为0(你可以按数组的方法来理解,认为0代表第一个字节,或者认为0代表相对于首个字节的偏移量)
int main()
{
FILE* pf = fopen("test4_2.txt", "w");
fprintf(pf, "helloworld");
printf("%d", ftell(pf));
return 0;
}
这里的文件位置指针是指向末尾字母后面的一个字节的位置--10(如果指向d话就为9,指向d后面一个字节位置就是10 )
既然我们能够获取文件位置指针的大小,我们也可以修改部分文字
fseek函数
int fseek(FILE *stream, long int offset, int whence)
该函数的作用就是调整文件位置指针。
whence表示你要开始的位置,offset表示相对于whence的偏移量(+表示从whence开始想左,-表示从whence开始向右)
int main()
{
FILE* pf = fopen("test4_2.txt", "r+");
fseek(pf,-5, SEEK_END);
fprintf(pf, "happy");
/*printf("%d", ftell(pf));*/
return 0;
}
fseek(pf,-5,SEEK_END)是从该数据最后一个数字后面的那个 字节的位置向前偏移5个位置。
这里成功地将world修改为happy。
rewind函数
void rewind(FILE *stream)
将文件位置指针置为0,即指向第一个字节
这里我们就不举例了
接下来实现读取文件全文内容
先往一个文件里输入两行数据
int main()
{
FILE* pf = fopen("test4_3.txt", "w");
char arr[100] = { 0 };
/*fseek(pf, 0, SEEK_END);*/
fwrite("helloworld\nhelloworld",1,20,pf);
fclose(pf);
pf = NULL;
return 0;
}
这里因为\n占了一个字节的位置,所以最后的d没有输入上去!
int main()
{
FILE* pf = fopen("test4_3.txt", "r");
char arr[100] = { 0 };
fseek(pf, 0, SEEK_END);
int count = ftell(pf);
rewind(pf);
fread(arr,1,count,pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
return 0;
}
当然如果你想手工计算然后读取的话除了把总字节数加起来,还要加上第一行的\n因此读取的字节数应该是10+1+9=20.
int main()
{
FILE* pf = fopen("test4_3.txt", "r");
char arr[100] = { 0 };
fseek(pf, 0, SEEK_END);
int count = ftell(pf);
rewind(pf);
fread(arr,1,20,pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
return 0;
}
以上就是全部内容了,如有错误还望各位指正!!