【Linux】应用篇二--标准IO的字符输入和输出

本文详细介绍了C语言中的标准IO操作,包括单个字符和整行的输入与输出,以及二进制文件的读写。重点讲解了fgetc、getc、getchar、fputc、putc、putchar、fgets、puts、fputs等函数的使用,强调了安全性和效率问题,如避免使用gets以防止缓冲区溢出,并给出了多个示例代码进行说明。
摘要由CSDN通过智能技术生成


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

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

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

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
文件解密是指将加密过的文件还原成原始的文件。在Java中,可以使用文件字符IO流来实现文件解密。 首先,需要使用FileReader类来读取加密文件中的字符流。然后,使用自定义的解密算法对字符流进行解密。最后,使用FileWriter类将解密后的字符流写入到新的文件中。 以下是一个简单的Java文件解密示例代码: ```java import java.io.*; public class FileDecryptor { public static void main(String[] args) { try { // 读取加密文件 FileReader fr = new FileReader("encrypted.txt"); BufferedReader br = new BufferedReader(fr); // 解密字符流 String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(decrypt(line)); } // 写入解密后的文件 FileWriter fw = new FileWriter("decrypted.txt"); BufferedWriter bw = new BufferedWriter(fw); bw.write(sb.toString()); // 关闭流 br.close(); fr.close(); bw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } // 自定义解密算法 private static String decrypt(String line) { // TODO: 实现解密算法 return line; } } ``` 在上面的代码中,我们使用了FileReader和FileWriter类来读写文件,使用BufferedReader和BufferedWriter类来提高读写效率。同时,我们也定义了一个decrypt方法来实现自定义的解密算法。在实际应用中,需要根据具体的加密算法来实现decrypt方法。 希望这个简单的示例能够帮助你理解Java文件解密的基本原理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值