目录
int fgetc(FILE *stream); //函数
int getc(FILE *stream); //宏
int getchar(void); //只能读取标准输入
成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1),
getchar()等同于fgetc(stdin)
1函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。
2 tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)
3 打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!
4 调用getchar会阻塞,等待你的键盘输入
实验程序:
- #include
-
-
- int main()
- {
- FILE *fp;
- fp = fopen("1.txt","r");
- if(fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- printf("getc = %c\n",fgetc(fp));
- fclose(fp);
- fp = fopen("1.txt","r");
- if(fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- for(int i = 0;i < 4;i++)
- {
- printf("getc[%d] = %c\n",i,fgetc(fp));
-
- }
- fclose(fp);
- printf("getchar = %c\n",getchar());
-
- }
实验结果:
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
成功时返回写入的字符;出错时返回EOF(-1)
putchar(c)等同于fputc(c, stdout)
1返回和输入参数都是int类型
2遇到这种错误:Bad file descriptor, 很可能是文件打开的模式错误(只读模式去写,只写模式去读)
实验程序:
- #include
-
-
- int main()
- {
- FILE *fp;
- fp = fopen("1.txt","r");
- if(fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- printf("getc = %c\n",fgetc(fp));
- fclose(fp);
- fp = fopen("1.txt","r");
- if(fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- for(int i = 0;i < 4;i++)
- {
- printf("getc[%d] = %c\n",i,fgetc(fp));
-
- }
- fclose(fp);
- printf("getchar = %c\n",getchar());
-
-
- fp = fopen("1.txt","r+");
- if(fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- int rec = 'w';
- if(fputc(rec,fp) == -1)
- {
- perror("fputc");
- fclose(fp);
- return 0;
- }
- for(int i = 0;i < 4;i++)
- {
- printf("getc[%d] = %c\n",i,fgetc(fp));
-
- }
- fclose(fp);
- return 0;
- }
结果:
第一个a被写成了w,但是再次输出却是从b开始的, putchar就是直接输出到屏幕上,不多解释了。
char *gets(char *s); 读取标准输入到缓冲区s
char *fgets(char *s, int size, FILE *stream);
成功时返回s,到文件末尾或出错时返回NULL
遇到’\n’或已输入size-1个字符时返回,总是包含’\0’
注意事项:
1 gets函数已经被淘汰,因为会导致缓冲区溢出
2 fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。
实验程序:
- #include
-
- int main(int argc,char *argv[]){
- FILE *fp;
- char *ret;
- int retn;
- char buff[100];
- fp = fopen("1.txt","a+");
- if(fp==NULL){
- perror("fopen");
- return 0;
- }
- #if 1
- ret = fgets(buff,5,fp);
- if(ret==NULL){
- perror("fgets");
- fclose(fp);
- return 0;
- }
- printf("buff=%s\n",buff);
- #endif
- #if 0
- retn = fputs("hello world",fp);
- if(retn==-1){
- perror("fputs");
-
- }
- printf("hahaha\n");
- #endif
- fclose(fp);
-
- }
实验结果:
实验程序在上面被注释掉的
把输出位置改成屏幕也就是stdout结果为:
输出到文件里:
存储的格式不同:文本文件只能存储文本。
计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)
文本文件存字符二进制文件存0和1
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
void *ptr 读取内容放的位置指针
size_t size 读取的块大小
size_t n 读取的个数
FILE *fp 读取的文件指针
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
void *ptr 写文件的内容的位置指针
size_t size 写的块大小
size_t n 写的个数
FILE *fp 要写的文件指针
文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。
解决办法:移动指针到文件头;关闭文件,重新打开
实验程序:
- #include
- #include
- int main()
- {
- FILE *fp;
- fp = fopen("1.txt","r");
- if(fp == NULL)
- {
- perror("fopen");
- return 0;
- }
- char *buff;
- buff=(char*)malloc(100);
- if(buff==NULL){
- return 0;
-
- }
- size_t ret;
- ret = fread(buff,10,1,fp);
- if(ret==-1){
- perror("fread");
- goto end;
- }
-
- printf("buf=%s\n",buff);
-
- end:
- free(buff);
- fclose(fp);
- }
实验结果:
实验程序:
- #include
- #include
-
- typedef struct {
- char name[20];
- int age;
- char sex[10];
- }stu;
- int main()
- {
- FILE *fp;
- fp = fopen("1.bin","w");
- if(fp == NULL)
- {
- perror("fopen");
- }
- stu stu1,stu2;
- strcpy(stu1.name,"xiaoming");
- stu1.age = 20;
- strcpy(stu1.sex,"man");
- if(fwrite(&stu1,sizeof(stu1),1,fp) == -1)
- {
- printf("fwrite is default");
- return 0;
- fclose(fp);
- }
- fclose(fp);
- fp = fopen("1.bin","r");
- if(fp == NULL)
- {
- perror("fopen");
- }
- if(fread(&stu2,sizeof(stu2),1,fp) == -1)
- {
- printf("fread is default");
- return 0;
- fclose(fp);
- }
- printf("name:%s\nage: %d\nsex: %s\n",stu2.name,stu2.age,stu2.sex);
- fclose(fp);
-
-
-
- }
实验结果: