前言
我们先假设想一下如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件,本篇就来探讨一下C语言有关文件的操作。
个人主页:小张同学zkf
若有问题 评论区见
感兴趣就关注一下吧
目录
1.什么是文件
磁盘(硬盘)上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
1.1 程序文件
1.2 数据文件
1.3 文件名
2.二进制文件和文本文件
3.文件的打开和关闭
3.1流和标准流
3.1.1流
3.1.2标准流
那是因为C语言程序在启动的时候,默认打开了3个流:• stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。• stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。• stderr - 标准错误流,大多数环境中输出到显示器界面。这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为 文件指针 。C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。
3.2文件指针
例如,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
struct _ iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};typedef struct _ iobuf FILE ;
FILE* pf; // ⽂件指针变量
3.3 文件的打开和关闭
ANSI C 规定使用 fopen 函数来打开文件, fclose 来关闭文件。
// 打开⽂件FILE * fopen ( const char * filename, const char * mode );// 关闭⽂件int fclose ( FILE * stream );
mode表示文件的打开模式,下面都是文件的打开模式:
/* fopen fclose example */
#include <stdio.h>
int main ()
{
FILE * pFile;
//打开⽂件
pFile = fopen ("myfile.txt","w");
//⽂件操作
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//关闭⽂件
fclose (pFile);
}
return 0;
}
4.文件的顺序读写
4.1顺序读写函数介绍
4.2fputc和fgetc
这个函数就是把字符写到文件里,若写入成功,返回的是这个字符的asc码值,若失败,返回EOF(-1)
这个函数就是把这个文件里的数据一个字符一个字符的读取出来,若读取成功,返回的是读取成功的字符的asc码值,若读取到文件末尾,返回EOF(-1)
4.3fputs和fgets
fputs是以文本行的形式将字符串写入文件里,若写入成功,返回非负值,若失败,返回EOF(-1)
这个num是要在文件里读多少个字符,str是把字符读出来之后存放的地址,stream要读的文件
若读取成功,返回str,若失败,返回空指针
4.4fread和fwrite
ptr是存放要写入这个文件的指针,size是输入这个文件每个元素的字节大小,count是写入这个文件的个数,steam是要写入的文件,写进去的文件里的数据转换成二进制信息
返回成功写入文件的个数,若返回的个数与count不同,则写入失败
这个就和上面的刚好相反,把文件里的二进制数据以size每个元素字节大小和count个数读取到ptr指向的空间,返回的是成功读取的个数,若返回的数与count不同,则读取失败
4.5对比一组函数
scanf/fscanf/sscanfprintf/fprintf/sprintf
你会发现fprintf与fscanf参数与printf和scanf相比就前面多个文件指针参数,剩下的都一样,他们都是以指定格式写入文件或从文件读取
那sscanf与sprintf是什么那
sscanf就是把字符串读成格式化数据
sprintf就是把格式化数据转化成字符串
5.文件的随机读取
5.1fseek
有时候我们文件里的光标可能需要为我们移动到自己想要的位置,那该怎么做那
需要用到fseek函数
功能:根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。
int fseek ( FILE * stream, long int offset, int origin );
offset是偏移量,origin是起始位置,起始位置有三种情况:
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ( "example.txt" , "wb" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}
5. 2ftell
long int ftell ( FILE * stream );
#include <stdio.h>
int main ()
{
FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL)
perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return 0;
}
5.3rewind
void rewind ( FILE * stream );
#include <stdio.h>
int main ()
{
int n;
FILE * pFile;
char buffer [27];
pFile = fopen ("myfile.txt","w+");
for ( n='A' ; n<='Z' ; n++)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]='\0';
printf(buffer);
return 0;
}
6. 文件读取结束的判定
6.1被错误使用的 feof
很多人用feof是用来判断文件是否结束的,这是错误的!!!
文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )例如:• fgetc 判断是否为 EOF• fgets 判断返回值是否为 NULL
二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。例如:• fread判断返回值是否小于实际要读的个数。
文本文件的例子:# include <stdio.h># include <stdlib.h>int main ( void ){int c; // 注意: int ,⾮ char ,要求处理 EOFFILE* fp = fopen( "test.txt" , "r" );if (!fp) {perror( "File opening failed" );return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回 EOFwhile ((c = fgetc(fp)) != EOF) // 标准 C I/O 读取⽂件循环{putchar (c);}// 判断是什么原因结束的if (ferror(fp))puts ( "I/O error when reading" );else if (feof(fp))puts ( "End of file reached successfully" );fclose(fp);}
二进制文件的例子:
# include <stdio.h>enum { SIZE = 5 };int main ( void ){double a[SIZE] = { 1. , 2. , 3. , 4. , 5. };FILE *fp = fopen( "test.bin" , "wb" ); // 必须⽤⼆进制模式fwrite(a, sizeof *a, SIZE, fp);// 写 double 的数组fclose(fp);double b[SIZE];fp = fopen( "test.bin" , "rb" );size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组if (ret_code == SIZE) {puts ( "Array read successfully, contents: " );for ( int n = 0 ; n < SIZE; ++n)printf ( "%f " , b[n]);putchar ( '\n' );} else { // error handlingif (feof(fp))printf ( "Error reading test.bin: unexpected end of file\n" );else if (ferror(fp)) {perror( "Error reading test.bin" );}}fclose(fp);}
7. 文件缓冲区
结束语
本篇博客涉及知识多,小编也在尽力总结,可以采取对比记忆等方法记忆,文件操作有关知识就总结到这里吧
OK感谢观看!!!