一、读写单个字符
1.读写流
流支持不同的读写方式:
读写一个字符:fgetc()/fputc()一次读/写一个字符
读写一行:fgets()和fputs()一次读/写一行
读写若干个对象:fread()/fwrite() 每次读/写若干个对象,而每个对象具有相同的长度
2.按字符输入
下列函数用来输入一个字符:
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream); //宏
int getchar(void);
成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1)
getchar()等同于fgetc(stdin)
getc和fgetc区别是一个是宏一个是函数
注意事项:
函数返回值是int类型不是char类型,主要是为了扩展返回值的范围;
stdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入);
打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置;
调用getchar会阻塞,等待你的键盘输入。
#include <stdio.h>
int main(int argc,char *argv[]){
FILE *fp;
int rec;
fp = fopen("1.txt","r");
if(fp==NULL){
perror("fopen");
return 0;
}
rec = fgetc(fp);
printf("Get char=%c\n",rec);
rec = fgetc(fp);
printf("Get char=%c\n",rec);
rec = fgetc(fp);
printf("Get char=%c\n",rec);
fclose(fp);
}
#include <stdio.h>
int main(int argc,char *argv[]){
FILE *fp;
int rec;
if(fp==NULL){
perror("fgetc");
return 0;
}
rec = fgetc(fp);
if(rec==-1){
perror("fgetc");
fclose(fp);
return 0;
}
printf("Get char=%c\n",rec);
rec = getchar();
printf("Get STD input=%c\n",rec);
fclose(fp);
}
3.按字符输出
下列函数用来输出一个字符:
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
成功时返回写入的字符;出错时返回EOF
putchar(c)等同于fputc(c, stdout)
注意事项:
1返回和输入参数都是int类型
2遇到这种错误:Bad file descriptor, 很可能是文件打开的模式错误(只读模式去写,只写模式去读)
#include <stdio.h>
int main(int argc,char *argv[]){
FILE *fp;
int rec;
fp = fopen("1.txt","a+");
if(fp==NULL){
perror("fopen");
return 0;
}
int wrc='w';
rec = fputc(wrc,fp);
if(rec==-1){
perror("fputc");
fclose(fp);
return 0;
}
putchar(wrc);
fclose(fp);
}
读写若干个对象:fread()/fwrite() 每次读/写若干个对象,而每个对象具有相同的长度
二、按行输入文件
下列函数用来输入一行:
#include <stdio.h>
char *gets(char *s);
char *fgets(char *s, int size, FILE *stream);
成功时返回s,到文件末尾或出错时返回NULL
gets不推荐使用,容易造成缓冲区溢出
遇到’\n’或已输入size-1个字符时返回,总是包含’\0’
#include <stdio.h>
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;
}
ret = fgets(buff,5,fp);
if(ret==NULL){
perror("fgets");
fclose(fp);
return 0;
}
printf("buff=%s\n",buff);
}
注意事项:
gets函数已经被淘汰,因为会导致缓冲区溢出。
fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。
三、按行输出文件
下列函数用来输入字符串
int puts(const char *s);
int fputs(const char *s, FILE *stream);
成功时返回非负整数;出错时返回EOF
puts将缓冲区s中的字符串输出到stdout,并追加’\n’
fputs将缓冲区s中的字符串输出到stream,不追加‘\n’
#include <stdio.h>
int main(int argc,char *argv[]){
FILE *fp;
int rec;
fp = fopen("1.txt","a+");
if(fp==NULL){
perror("fopen");
return 0;
}
retn = fputs("hello world",fp);
if(retn==-1){
perror("fputs");
}
printf("hahaha\n");
fclose(fp);
}
四、作业
完成按行输出文件实验,并提交实验截图
#include <stdio.h>
int main(int argc, char* argv[]) {
FILE * fp;
char ch[20] = "abcdefg";
int ret;
fp = fopen("1.txt", "a+");
if (fp == NULL) {
perror("fopen");
return 0;
}
ret = fputs("hello world", fp);
if (ret == -1) {
perror("fputs");
}
puts(ch);
printf("hahaha\n");
fclose(fp);
}