网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
| 功能 | 函数名 | 适用于 |
| 字符输入 | fgetc | 所有输入流 |
| 字符输出 | fputc | 所有输出流 |
| 文本行输入 | fgets | 所有输入流 |
| 文本行输出 | fputs | 所有输出流 |
| 格式化输入 | fscanf | 所有输入流 |
| 格式化输出 | fprintf | 所有输出流 |
| 二进制输入 | fread | 文件 |
| 二进制输出 | fwrite | 文件 |
fgetc 和 fputc 函数与getchar、putcgar函数类似,只不过,后者是从键盘读(输入),写(输出)在屏幕,而前者可以从所有流输入输出。
举个例子:下面条语句的意思是从标准输入流中获取一个字符:
ch=getchar();
同样的功能,fgetc也可以做到:
ch=fgetc(stdin);
当然,fgetc的主要功能是从文件中读取字符,下面条语句的意思是从pf指定的文件中获取一个字符
ch=fgetc(pf);
在使用这些文件操作函数时可以模仿标准输入输出流函数的用法,只需要关注它们的参数和要写入的文件指针名即可。
文件输入输出函数 | 函数返回类型及参数 |
fgetc | int fgetc ( FILE * stream ); |
fputc | int fputc ( int character, FILE * stream ); |
fgets | char * fgets ( char * str, int num, FILE * stream ); |
fputs | int fputs ( const char * str, FILE * stream ); |
fscanf | int fscanf ( FILE * stream, const char * format, … ); |
fprintf | int fprintf ( FILE * stream, const char * format, … ); |
fread | size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); |
fwrite | size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); |
scanf 和 printf 家族的对比及其区分
scanf 和 printf 函数只适用于标准输入输出流,即从键盘输入;而fprint函数和fscanf函数使用与所有输入输出流,多几个参数而已。int sprintf ( char * str, const char * format, … );
而sscanf和sprintf函数却有着将数据转化为字符串的功能。先观察一下这些函数的参数及返回值
sscanf | int sscanf ( const char * s, const char * format, …); |
sprintf | int sprintf ( char * str, const char * format, … ); |
format是格式的意思,其中一个格式对应一个参数,sscanf sprintf 与标准输入流相同,不过在参数列表中多了一个指针
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
上面这段代码的意思就是将双引号里面的数据全部转化为字符串并放入buffer中。
3.文件的随机读写
文件的随机读写函数
fseek | int fseek ( FILE * stream, long int offset, int origin ); |
ftell | long int ftell ( FILE * stream ); |
rewind | void rewind ( FILE * stream ); |
fseek函数:可以将文件看做数组,在fopen打开的文件中直接定位到任意字节处,根据文件指针的位置和偏移量来定位文件指针。
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;
}
ftell函数:返回文件指针相对于起始位置的偏移量
#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);
size = ftell(pFile);
fclose(pFile);
printf("Size of myfile.txt: %ld bytes.\n", size);
}
return 0;
}
rewind函数:让文件指针的位置回到文件的起始位置
#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';
puts(buffer);
return 0;
}
上述代码的意思是先将字符A~Z写入文件 myfile.txt ,再用rewind函数使文件指针回到起始位置,再以二进制的形式读取它们。
四、文件缓冲区
缓冲区,即临时储存数据的地方,可以提高效率节约时间。且缓冲区这个概念不止在文件里有。在平时输入输出的时候,也会有缓冲区,当用户打错字符的时候,可以直接通过键盘修正,最后按下Enter键,传输的才是正确的输入。下面以文件的缓冲区为例介绍缓冲区是如何提高效率的。
如果内存从硬盘中拿数据的时候,硬板每输入一个数据,内存就拿一次,每输入一个数据,内存就拿一次…那么内存的内存读取的负担就会非常大,有些数据是源源不断的从硬盘传递过来的,所以就有了缓冲区这个概念。
缓冲区是系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。计算机从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上;如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等),缓冲区的大小是由C原因的编译器自身决定的。
五、文件的读取结束的判定
判断文件是否读取结束的两个标准
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:fgetc 判断是否为 EOF ,fgets 判断返回值是否为 NULL。
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:fread判断返回值是否小于实际要读的个数。
被错误使用的feof
feof函数的作用是:当文件读取结束的时候,判断是读取结束的原因是否是 遇到文件尾结束。要牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束
在用上述两个方法判断是否结束后,在用feof函数判断读取结束的原因
//判断是什么原因结束的
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
puts("End of file reached successfully");
非常感谢各位对纪宁的支持,你们的支持就是我不断更新的动力
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
5879440)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!