一个一个字符输入输出
getc()和fgetc()函数即可以接收键盘输入也可以读取文本文件成功,返回读取的字符,否则返回EOF。
putc()和fputc()是输出函数,(f)putc(ch,stdout)写字符到显示器,也可以写到文本文件成功,putc()返回输出的字符,否则返回eof
函数都在头文件stdio.h中,对使用gcc环境的初学者来说getc()和fgetc(),putc()和fputc()没有区别
实例:
FILE *fp;
fp = fopen("example.c", "r");
while (c = fgetc(fp), c != EOF)
{
//while if语句真值看逗号分割的最后一个(即c != EOF的真值)
fputc(c,stdout);
}
/上面的程序实现的是把fp中字符一个一个地打到屏幕上
a= 'a';
printf("%d", (putc(a, stdout)));//输出为a97
a= 'a';
printf("%d", (fputc(a, stdout)));//输出为a97
//我们发现对于getc putc f写不写没啥差别
getchar()//标准输入(键盘输入)
putchar(int c)将指定的字符输出到标准输出(命令行)
getc的功能包含getchar的功能,同理putc的功能包含putchar()的功能
总结:
一.标准输入输出一个字符
1.从键盘输入一个字符 scanf("%c",&c)等价于c=getchar()等价于c=(f)getc(stdin)
//从标准输入读取字符;
2.标准输出打印出一个字符 printf("%c",c)等价于putchar(c)等价于(f)putc(c,stdout);
//把字符通过命令行输出(标准输出)
二.从文件输入输出一个字符
c=(f)getc(file*stream);//返回字符值(ASCII)
(f)putc(c,file*stream);//返回字符值(ASCII)
fscanf(file*stream,"%c",&c)//返回字符数
printf( file*stream,"%c",c);//返回字符数
"%d" "%lf"的用法大家都熟知了方便读入数值在此不介绍了
文件特有的操作:(这俩也可以输入输出多个(确定长度)字符)
fwrite(&c, sizeof(char), 1, fp);//c也可以是一个结构体,第三个参数1代表1个sizeof(char)一个字符
fread(c, strlen(str), 1, fp);//c也可以是一个结构体,第三个参数1代表1个sizeof(char)一个字符
ferror(FILE *fp)未出错返回值为0,否则返回非0,表示有错。
若程序以只写的方式打开一个文件名为”test.txt”的文件。这样,该文件就只能写而不能读了。而如果这时程序企图应用fgetc函数从fp所指的文件中读出一个字符,这是违法的,因此文件自动产生错误标志。可以用clearerr函数复位错误标志
feof(FILE *fp);遇到文件结束符返回非0,否则返回0。
ftell(FILE *fp)返回long类型文件指针的位置,若出错则返回–1L。
fseek(FILE *fp, long offset, int base)定位文件指针。返回值:成功返回0,否则返回非0。
rewind(FILE *fp)重定位文件指针无返回值
fopen打开、fclose保存并关闭、 freopen换一个打开、fflush保存不关闭、rename重命名、remove删除、perror打印错误信息 不介绍了就
一行一行(或多个字符)输入输出
1.从标准输入输出(键入,命令行屏幕输出)
gets(char *) 和scanf("%s",char *)的区别是
gets遇到\n才结尾,并且返回的是char *
例如输入的是abc 12\n gets(s)存入的是*s=abc 12\0 返回的是指针c。
scanf("%s",char *)遇到 空格,Tab,\n都会结尾,返回的是读入的字符个数
例如输入的是abc 12\n scanf("%s",s)存入的是*s=abc\0 返回的是读入的字符数。
注意gets没有输入大小(边界)检查 如果原先分配的空间小于输入的字符数会造成溢出!!
puts(char *s);输出字符串'\0'转换为回车换行符'\n',成功则返回0,失败则返回EOF
如果用scanf输入,用它可能会多出换行
printf("%s", s);输出字符串'\0'结束,成功则返回输出的字符数,失败则返回EOF
2.从文件或键盘输入
char buff[100];
while(fgets(buf, sizeof(buf), fp))//逐行或逐100(若读入的是100字符以上行)
还有fscanf(FILE *fp, "%s",str);
fputs(char *string, FILE *fp);//fputs函数没有字符串长度的限制
fprintf(FILE *fp, "%s",str);
都是平行的
要读的东西太长就用
fwrite(void *buf, int size, int count, FILE *fp);
fread(void *buf, int size, int count, FILE *fp);
就行 提前判定一下有多少字符。。。
还有一个特殊的从字符串输入输出
函数sscanf()和sprintf()用的很少。。。
好了好了不总结了好费时间,在下面贴出一个骗OJ样例的c代码作为结尾。。。
#include
int main()
{
FILE *ff = fopen("out.txt", "w+"); //改输出文件名
if (0) //1代表屏幕读取,屏幕输出
{
char str[10000];
fprintf(stdout,"输入的") ;
while (gets(str))
puts(str);
}
if (0) //1代表文件读取,屏幕输出
{
char *text;
fprintf(stdout,"文件里的") ;
FILE *pf = fopen("in.txt", "r"); //改文件名
fseek(pf, 0, SEEK_END);
long lSize = ftell(pf);
text = (char *)malloc(lSize + 1);
rewind(pf);
fread(text, sizeof(char), lSize, pf);
text[lSize] = '\0';
fputs(text, stdout);
}
if (1) //1代表屏幕读取,文件输出
{
char str[10000];
fprintf(ff,"输入的") ;
while (gets(str))
fputs(str, ff);
}
if (1) //1代表文件读取,文件输出
{
char *text;
fprintf(ff,"文件里的") ;
FILE *pf = fopen("in.txt", "r"); //改文件名
fseek(pf, 0, SEEK_END);
long lSize = ftell(pf);
text = (char *)malloc(lSize + 1);
rewind(pf);
fread(text, sizeof(char), lSize, pf);
text[lSize] = '\0';
fputs(text, ff);
}
system("pause");
return 0;
}