c语言输入输出方法总结

一个一个字符输入输出

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;
}

你可能感兴趣的:(cstudy,c语言)