c语言字符读取与输出操作全解及案例分析 (fgetc, getc, getchar, fgets, gets, fputc, putc, putchar, fputs, puts)

前言

  • 每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。FILE是头文件stdio.h中定义的一个结构体,结构如下:

struct iobuf {
    char *ptr;
    int cnt;
    char *base;
    int flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char *tmpfname;
  };
  typedef struct _iobuf FILE;
  • EOF为stdio.h头文件中声明的宏,值为-1。


一、字符读取


1、fgetc函数

fgetc函数从文件流里取出下一个字节并把它作为一个字符(无符号字符)返回。当它到达文件尾或出现错误时,返回EOF,必须通过ferror或feof区分两种情况。

1)引用头文件

#include<stdio.h>

2)函数原型

int  fgetc(FILE *stream)

3)参数 stream

这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。

4)返回值

该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

5) 案例

#include <stdio.h>
#include <stdlib.h>
​
int main ()
{
   FILE *fp;
   int c;
   int n = 0;
​
   fp = fopen("test.txt","r");
   if(fp == NULL)
   {
      perror("打开文件时发生错误");
      exit(1);
   }
   if(ferror(fp))
   {
       printf("Error to read the file\n");
       exit(-1);
   }
   do
   {
      c = fgetc(fp);
      if( feof(fp) )
      {
          break ;
      }
      printf("%c", c);
   }while(1);
​
   fclose(fp);
   return 0;
}

假设有一个文本文件test.txt,它的内容如下。文件将作为实例中的输入:

I have a dream!

编译并运行上面的程序,产生如下结果:

I have a dream!

2、getc函数

getc函数从文件流里取出下一个字节并把它作为一个字符(无符号字符)返回。当它到达文件尾或出现错误时,返回EOF,必须通过ferror或feof区分两种情况。

1) 引用头文件

#include<stdio.h>

2)函数原型

int getc(FILE *stream)

3)参数 stream

这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。

4)返回值

该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

5) 案例

#include<stdio.h>
​
int main()
{
   char cvar;
​
   printf("请输入字符:");
   cvar = getc(stdin);
   printf("输入的字符:");
   putc(cvar, stdout);
   
   return 0;
}

程序执行结果如下:

请输入字符:p
输入的字符:p

注:getc函数的作用和fgetc一样,但它有可能被实现为一个宏,如果这样,stream参数就可能被计算不止一次,所以它不能有副作用(例如不能影响变量)。此外,也不能保证能够使用getc的地址作为一个函数指针。

3、getchar函数

C 库函数 int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符)。这等同于 getc 带有 stdin 作为参数。

1)引用头文件

#include<stdio.h>

2)函数原型

int getchar(void)

3)参数NA

4)返回值

该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

5) 案例

#include <stdio.h>
​
int main ()
{
   char c;
 
   printf("请输入字符:");
   c = getchar();
 
   printf("输入的字符:");
   putchar(c);
​
   return(0);
}

程序执行结果如下:

请输入字符:s
输入的字符:s

4、fgets函数

该函数从指定的流 stream 读取一行,并把它存储在 s 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时(它会把遇到的换行符也传递到接收字符串里,再加上一个表示结尾的空字节\0),或者到达文件末尾时,它会停止。

1)引用头文件

#include<stdio.h>

2)函数原型

char *fgets(char *s, int n, FILE *stream)

3)参数

  • s -- 这是一个指向字符数组的指针,该数组存储了要读取的字符串。

  • n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 s传递的数组长度。

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

4)返回值

当成功完成时,fgets返回指向字符串s的指针。如果文件流已到达文件尾,fgets会设置这个文件流的EOF标识并返回一个空指针。如果出现读错误,fgets返回一个空指针并设置errno以指示出错的类型。

5) 案例

#include <stdio.h>
​
int main()
{
   FILE *fp;
   char s[1024];
​
   /* 打开用于读取的文件 */
   fp = fopen("test.txt" , "r");
   if(fp == NULL) {
      perror("打开文件时发生错误");
      return -1;
   }
   if( fgets (s, 1024, fp)!=NULL ) {
      /* 向标准输出 stdout 写入内容 */
      puts(s);
   }
   fclose(fp);
   
   return 0;
}

假设我们有一个文本文件 test.txt,它的内容如下。文件将作为实例中的输入:

Today is 2020

程序运行输出如下结果:

Today is 2020

5、gets函数

该函数从标准输入 stdin 读取一行,并把它存储在 s 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,并且会丢弃遇到的换行符。

1)引用头文件

#include<stdio.h>

2)函数原型

char *gets(char *s)

3)参数

s -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。

4)返回值

如果成功,该函数返回 s。如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。

5) 案例

#include <stdio.h>
​
int main()
{
   char str[50];
​
   printf("请输入一个字符串:");
   gets(str);
​
   printf("输入的字符串是:%s", str);
​
   return(0);
}

程序运行输出结果如下:

请输入一个字符串:abcdefg
输入的字符串是:abcdefg

二、字符输出


1、fputc函数

该函数把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。

1)引用头文件

#include<stdio.h>

2)函数原型

int fputc(int char, FILE *stream)

3)参数

  • char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。

4)返回值

如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

5) 案例

#include <stdio.h>
​
int main ()
{
   int c;
   FILE *fd;
   fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","r");
   if(fd == NULL)
   {
       perror("文件打开出错!\n");
       return -1;
   }
   c = fgetc(fd);
   while(c != EOF)
   {
        fputc(c,stdout);
        c=fgetc(fd);
   }
   fclose(fd);
   return 0;
}

程序运行输出结果如下:

I have a dream!

2、putc函数

该函数把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。

1)引用头文件

#include<stdio.h>

2)函数原型

int putc(int char, FILE *stream)

3)参数

  • char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。

4)返回值

该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。

5) 案例

#include <stdio.h>
​
int main ()
{
   int c;
   FILE *fd;
   fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","r");
   if(fd == NULL)
   {
       perror("文件打开出错");
       return -1;
   }
   c = fgetc(fd);
   while(c != EOF)
   {
        putc(c,stdout);
        c=fgetc(fd);
   }
   fclose(fd);
​
   return 0;
}

程序运行输出结果如下:

I have a dream!

3、putchar函数

该函数把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中,相当于putc(c,stdout)。

1)引用头文件

#include <stdio.h>

2)函数原型

int putc(int char, FILE *stream)

3)参数

char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。

4)返回值

该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。

5) 案例

#include <stdio.h>
​
int main ()
{
   char ch;
​
   for(ch = 'A' ; ch <= 'Z' ; ch++) {
      putchar(ch);
   }
   
   return 0;
}

程序运行输出结果如下:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

4、fputs函数

该函数把字符串写入到指定的流 stream 中,但不包括空字符。

1)引用头文件

#include <stdio.h>

2)函数原型

int fputs(const char *str, FILE *stream)

3)参数

  • str -- 这是一个字符数组,包含了要写入的以空字符终止的字符序列。

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。

4)返回值

该函数返回一个非负值,如果发生错误则返回 EOF。

5) 案例

#include <stdio.h>
​
int main ()
{
   int c;
   FILE *fd;
   fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","w+");
   char *s = "c语言程序设计\n";
   fputs(s,fd);
   fputs("python实战",fd);
   fclose(fd);
​
   return 0;
}

程序运行输出结果如下:

c语言程序设计
python实战

5、puts函数

该函数把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。

1)引用头文件

#include <stdio.h>

2)函数原型

int puts(const char *str)

3)参数

str -- 这是要被写入的 C 字符串。

4)返回值

如果成功,该函数返回一个非负值,如果发生错误则返回 EOF。

5) 案例

#include <stdio.h>
​
int main ()
{
   int c;
   FILE *fd;
   fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","w+");
   char *s = "c语言程序设计\n";
   puts(s);
   fclose(fd);
​
   return 0;
}

程序运行输出结果如下:

c语言程序设计
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值