一、单个字符的输入与输出

1、读单个字符

下列函数用来输入一个字符:

 #include  <stdio.h>
 int  fgetc(FILE *stream);
 int  getc(FILE *stream);   //宏
 int  getchar(void);

成功时返回读取的字符;若到文件末尾出错时返回EOF(-1)

  • getchar()等同于fgetc(stdin)
  • getcfgetc区别是一个是一个是函数

注意事项:

1、函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。
2、stdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)
3、打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。
读写注意文件位置!
4、调用getchar会阻塞,等待你的键盘输入

示例:

  int  ch;
  ch = fgetc(stdin);
  printf(%c\n”, ch);

  FILE  *fp;
  int  ch, count = 0;
  if ((fp  =  fopen(argv[1], “r”)) == NULL)  
  { 
    perror(“fopen”);  
    return  -1;
  }
  while ((ch  =  fgetc(fp)) != EOF) 
  {  
    count++; 
  }
  printf(“total  %d bytes\n”, count);

2、写单个字符

下列函数用来输出一个字符:

#include  <stdio.h>
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,
   很可能是文件打开的模式错误(只读模式去写,只写模式去读)

示例:

  fputc(‘a’, stdout);
  putchar(‘\n’);

  FILE  *fp;
  int  ch;
  if ((fp  =  fopen(argv[1], “w”)) == NULL) 
  { 
     perror(“fopen”); 
     return  -1;
  }
  for(ch = ‘a’; ch <=‘z’; ch++)
  {  
     fputc(ch, fp); 
  }

二、整行的输入与输出

1、读取整个行

下列函数用来输入一行:

#include  <stdio.h>
char  *gets(char *s);
char *fgets(char *s, int size, FILE *stream);

成功返回s,到文件末尾出错时返回NULL

  • gets不推荐使用,容易造成缓冲区溢出
  • 遇到’\n’或已输入size-1个字符时返回,返回时自动加上’\0’

注意事项:

1、gets函数已经被淘汰,因为会导致缓冲区溢出
2、fgets 函数第二个参数,输入的数据超出size,
   size-1个字符会保存到缓冲区,最后添加’\0’,
   如果输入数据少于size-1 后面会添加换行符。
#define  N  6
 char buf[N];
 fgets(buf, N, stdin);
 printf(%s”, buf);

2、写整个行

下列函数用来输出字符串:

#include  <stdio.h>
int  puts(const char *s);
int fputs(const char *s,  FILE *stream);

成功时返回输出的字符个数;出错时返回EOF(-1)

  • puts将缓冲区s中的字符串输出stdout并追加’\n’
  • fputs将缓冲区s中的字符串输出到stream,不追加 ‘\n’

示例:

puts(“hello  world”);
FILE  *fp;
char buf[] = “hello world”;
if ((fp  =  fopen(argv[1], “a”)) == NULL)  
{ 
     perror(“fopen”);  
     return  -1;
}
fputs(buf, fp);

三、二进制的输入与输出

文本文件二进制文件的区别:
存储的格式不同,文本文件只能存储文本。

下列函数用来从流中读写若干个对象:

#include  <stdio.h>
size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
  • 成功返回读写的对象个数出错时返回EOF(-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: 要写的文件指针

注意事项:

文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

解决办法:移动指针(后面讲解)到文件头;关闭文件,重新打开

示例:

  int s[10];
  if (fread(s, sizeof(int), 10, fp) < 0) 
  {
     perror(“fread”);
     return  -1;
   }
  
   struct  student 
   {
       int  no;
       char name[8];
       float  score;
   }  s[] = {{ 1, “zhang”, 97}, {2, “wang”, 95}};

   fwrite(s, sizeof(struct student), 2, fp);

到这里就结束啦!
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐