1.3格式化输出函数(fprintf)&&格式化输入函数(fscanf)
格式化输出函数(向文件中写入信息):
int fprintf( FILE *stream, const char *format [, argument ]...);
struct stu { char name[10]; char sex[5]; int age; double weight; }; int main() { struct stu s = { "lisi","男",18,60.0 }; FILE* pf = fopen("text.txt", "w"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 0; } fprintf(pf, "%s %s %d %lf", s.name, s.sex, s.age, s.weight);//向文件中输出信息 fclose(pf); pf = NULL; return 0; }
从代码中可以看到:我们将s进行了初始化,想将该内容拷贝到text.txt文件夹中:
代码执行后可以明显发现文件夹中已经成功拷贝。
格式化输入函数(从文件中读取信息):
int fscanf( FILE *stream, const char *format [, argument ]... );
struct stu { char name[10]; char sex[5]; int age; double weight; }; int main() { struct stu s = { 0 }; FILE* pf = fopen("text.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 0; } fscanf(pf, "%s %s %d %lf", s.name, s.sex, &(s.age), &(s.weight));//从文件中获得信息 printf("%s %s %d %lf", s.name, s.sex, s.age, s.weight); fclose(pf); pf = NULL; return 0; }
代码中我们对s的内容初始化为0,代码执行后将文件夹中的内容拷贝到了s中:
我们还可以用stdin&&stdout来从键盘输入数据以及从屏幕上打印数据:
1.4 扩展:
intsprintf(char*buffer,constchar*format [,argument] ... );
intsscanf(constchar*buffer,constchar*format [,argument ] ... );
int main() { struct stu s1 = { "lisi","男",18,60 }; struct stu s2 = { 0 }; char buf[100] = { 0 }; //把格式化的数据转换成字符串存储到buf sprintf(buf, "%s %s %d %lf", s1.name, s1.sex, s1.age, s1.weight); printf("%s\n", buf); //从buf中读取格式化的数据到s2中 sscanf(buf, "%s %s %d %lf", s2.name, s2.sex, &(s2.age), &(s2.weight)); printf("%s %s %d %lf", s2.name, s2.sex, s2.age, s2.weight); return 0; }
总结:
- scanf/printf:是针对标准输入流/标准输出流的格式化输入/输出语句。
- fscanf/fprintf:是针对所有输入流/所有输出流的格式化输入/输出语句 。
- sscanf/sprintf:sscanf是从字符串中读取格式化数据,sprintf是把格式化数据输出成(存储到)字符串
1.5 二进制输出函数(fwrite)&&二进制输入函数(fread)
二进制输出函数:
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
typedef struct stu { char name[20]; int age; double weight; }stu; int main() { FILE* pf = fopen("text.txt", "wb"); if (pf ==NULL) { printf("%s\n", strerror(errno)); } stu s[2] = { {"zhangsan",18,60},{"lisi",19,65} }; fwrite(s, sizeof(stu), 2, pf); fclose(pf); pf = NULL; return 0; }
当我们查看文件里面的内容时:
有的符号我们认识,但有的符号却很奇怪,为什么呢?
由于我们写入的时二进制的形式,所以有些符号不认识很正常,但是当我们以二进制的形式读取时就不会出现这种奇怪的符号了。
二进制输入函数:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
typedef struct stu { char name[20]; int age; double weight; }stu; int main() { FILE* pf = fopen("text.txt", "rb"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 0; } stu s[2] = { 0 }; fread(s, sizeof(stu), 2, pf); printf("%s %d %lf\n%s %d %lf", s[0].name, s[0].age, s[0].weight, s[1].name, s[1].age, s[1].weight); fclose(pf); pf = NULL; return 0; }
当读取信息时就会读取正常的信息:
2 文件的随机读写
2.1 fseek:根据文件指针的位置和偏移量来定位文件指针
intfseek(FILE*stream,longoffset,intorigin );
刚开始的时候文件中存放的是abcdef:
int main() { FILE* pf = fopen("text.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 0; } fseek(pf, 2, SEEK_CUR); int ch = fgetc(pf); printf("%c\n", ch); fclose(pf); pf = NULL; return 0; }
在这之前我们还得了解一下origin:
SEEK_CUR
Current position of file pointer
SEEK_END
End of file
SEEK_SET
Beginning of file
至于为什么打印的是c:从a开始偏移2个字符得到的就是c.此时pf指向下一个字符(也就是d):
2.2 ftell :返回文件指针相对于起始位置的偏移量
long ftell( FILE *stream );
这个函数的用法很简单,就不多说了。
2.3 rewind :让文件指针的位置回到文件的起始位置
void rewind( FILE *stream );
这个函数的作用是让pf指向文件字符的开头:
好了,今天的分享就到这里了。希望老铁们能够指出文章中的错误所在,酸Q。