赞
踩
前言
我们先假设想一下如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件,本篇就来探讨一下C语言有关文件的操作。
个人主页:小张同学zkf
若有问题 评论区见
感兴趣就关注一下吧
目录
磁盘(硬盘)上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
那是因为C语言程序在启动的时候,默认打开了3个流:• stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。• stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。• stderr - 标准错误流,大多数环境中输出到显示器界面。这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为 文件指针 。C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。
例如,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; // ⽂件指针变量
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;
- }
这个函数就是把字符写到文件里,若写入成功,返回的是这个字符的asc码值,若失败,返回EOF(-1)
这个函数就是把这个文件里的数据一个字符一个字符的读取出来,若读取成功,返回的是读取成功的字符的asc码值,若读取到文件末尾,返回EOF(-1)
fputs是以文本行的形式将字符串写入文件里,若写入成功,返回非负值,若失败,返回EOF(-1)
这个num是要在文件里读多少个字符,str是把字符读出来之后存放的地址,stream要读的文件
若读取成功,返回str,若失败,返回空指针
ptr是存放要写入这个文件的指针,size是输入这个文件每个元素的字节大小,count是写入这个文件的个数,steam是要写入的文件,写进去的文件里的数据转换成二进制信息
返回成功写入文件的个数,若返回的个数与count不同,则写入失败
这个就和上面的刚好相反,把文件里的二进制数据以size每个元素字节大小和count个数读取到ptr指向的空间,返回的是成功读取的个数,若返回的数与count不同,则读取失败
scanf/fscanf/sscanfprintf/fprintf/sprintf
你会发现fprintf与fscanf参数与printf和scanf相比就前面多个文件指针参数,剩下的都一样,他们都是以指定格式写入文件或从文件读取
那sscanf与sprintf是什么那
sscanf就是把字符串读成格式化数据
sprintf就是把格式化数据转化成字符串
有时候我们文件里的光标可能需要为我们移动到自己想要的位置,那该怎么做那
需要用到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;
- }
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;
- }
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;
- }
很多人用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);}
结束语
本篇博客涉及知识多,小编也在尽力总结,可以采取对比记忆等方法记忆,文件操作有关知识就总结到这里吧
OK感谢观看!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。