C、C++缓冲区的刷新

平常做程序的时候我们经常会遇到这样的情况,本来直接输入的是这样的数据,然

而在读取输出的时候却不是我们输入时的数据。这是为什么呢? 原因就是我们在输入

的时候留下了垃圾,而我们定义的某个变量接受的数据正是“垃圾”而不是我们想要

的数据。没事总结一下C、C++中清除垃圾的方法(花了我一上午的时间啊,不过感觉

很有必要):

C语言中缓冲区的刷新:(清除输入时的垃圾)

1.fflush(stdin)
   
   头文件: include<stdio.h>
   清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串

后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)。

  **st是标准的意思,in指的是输入
  fflush(stdin)是C中的一个函数,用来刷新缓冲区,如果刷新成功返回的是 0,指

定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。

例:
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    fflush(stdin);
    scanf("%c",&ch);
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}
输入: 23       输出:23
       a              a
如果不加 fflush(stdin); 则输出的是 23 32 ,因为没有fflush(stdin)时第二个ch

接受的是 回车而不是 a;


2.getchar();
  
  头文件: #include<stdio.h>

   它的作用是单个的读取缓冲区里的数据,只能单个的读取; 用户输入的数据先存

放在缓冲区里,然后当执行getchar()时读取缓冲区里的相对第一个字符。如果出错

返回 -1。
   利用它只能单个读取字符的特性可以用它来清除部分输入时留下的垃圾。
例:
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    getchar();//如果没有getchar();则ch接受的数据将会是输入时留下的垃圾
              //空格或者是回车;在这里相当必要!!!
    scanf("%c",&ch);
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}


3. %*nc

   n的值是可以根据而要而改变的,表示的是 吸收的字符的个数。用法和 getchar()

相像,只不过它可以很方便的改变吸收的字符的个数。

例:
 #include<stdio.h>
int mian()
{
    int i;
    char ch;
    scanf("%d",&i);
    scanf("%*%c",&ch);// 如果没有 %*c 输出的ch是“垃圾”,加上后就正确了
    printf("i=%d,ch=%d\n",i,ch);
return 0;
}


C++ 中刷新缓冲区的方法


1,ignore()
 
   调用的形式: cin.ignore(n,ch); 其中 n 指的是忽略字符的个数,ch 代表的是

终止的字符。 默认的情况下以 EOF结束。。。

   利用它忽略字符的特性可以作为“清除输入垃圾”的方法,但要明确它并不是真正

的清除。。。
 
 例:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
      int i;
      char a;
      cin>>i;
      cin.ignore(1);// 用它忽略的是输入I之后的空格或者是回车;同C中的      

             //getchar();
      cin>>a;
      cout<<"i="<<i<<' '
          <<"a="<<(int)a<<endl;
      system("pause");
      return 0;
      }


2.cin.sync()

   用来清除缓冲区中未读取的信息

  例:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
      int i;
      char a;
      cin>>i;
      cin.ignore(1);
      cin>>a;
      cout<<"i="<<i<<' '
          <<"a="<<(int)a<<endl;
      system("pause");
      return 0;
      }
输入: jkifi
       fsjofia
输出: a: j   b: f   不加这个函数第二个输出的是 b: k
利用这个函数可以避免在一些地方输入出错问题!

3.cin.clear()

 这个只知道是用来重置错误标志的,具体的用法和功能还不是很清楚,弄清楚了再说

吧!

### 清除缓冲区的方法 在 C++ 中,清除输入和输出缓冲区可以通过不同的方式完成。以下是针对 `std::cin` 和 `std::cout` 缓冲区的操作说明。 #### 输入缓冲区清空 对于标准输入流 (`std::cin`) 的缓冲区清理,可以使用以下方法: 1. **忽略剩余的输入直到换行符** 使用 `ignore()` 方法可以丢弃缓冲区中的字符,直到遇到指定数量的字符或某个终止字符为止。例如: ```cpp std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); ``` 这里的 `std::numeric_limits<std::streamsize>::max()` 表示尽可能多地读取字符,而 `\n` 是终止条件[^4]。 2. **设置状态标志位** 如果需要恢复输入流的状态,可以调用 `clear()` 来重置错误标志位。例如: ```cpp std::cin.clear(); ``` #### 输出缓冲区刷新 对于标准输出流 (`std::cout`, `std::cerr`, 或者文件流),可以使用以下方法刷新缓冲区: 1. **手动刷新缓冲区** 调用 `flush()` 函数或者使用操纵器 `std::endl` 可以强制刷新缓冲区并将数据发送到目的地。例如: ```cpp std::cout << "This is a message." << std::flush; ``` 上述代码会立即将字符串 `"This is a message."` 发送到终端而不等待缓冲区自动刷新[^2]。 2. **关闭文件流时自动刷新** 当关闭一个文件流(如 `std::ofstream`)时,缓冲区的内容也会被自动刷新并写入文件中。例如: ```cpp std::ofstream output("example.txt"); output << "Data to write."; output.close(); // 自动刷新缓冲区 ``` #### 文件流操作中的缓冲管理 如果涉及文件流(如 `std::ifstream` 或 `std::ofstream`),则可以利用成员函数 `sync()` 手动同步内部缓冲区与外部设备的数据。此外,某些情况下可能还需要调整打开模式来控制缓冲行为。例如: ```cpp std::fstream file("data.txt", std::ios::in | std::ios::out); file.seekp(0, std::ios::end); // 移动到文件末尾 file.flush(); // 刷新缓冲区 ``` 需要注意的是,C++ 并未提供像 C 那样的 `fflush(stdin)` 功能,因为这种设计被认为不安全且不符合标准化需求[^5]。 --- ### 示例程序 下面是一个综合示例,展示如何在不同场景下清除或刷新缓冲区: ```cpp #include <iostream> #include <limits> int main() { int number; std::cout << "Enter an integer: "; std::cin >> number; // Clear the remaining characters in the input buffer std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::string name; std::cout << "Enter your name: "; getline(std::cin, name); // Output with manual flushing std::cout << "Hello, " << name << "! You entered: " << number << std::flush; return 0; } ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值