标签: input-buffer

可以使用fseek(stdin,1,SEEK_SET)或倒带(stdin)来刷新输入缓冲区而不是非便携式fflush(stdin)吗?

由于我发现fflush(stdin)不是一种可移植的方式来处理熟悉的"新行潜伏在输入缓冲区中"的问题,所以当我必须使用时,我一直在使用以下内容scanf:

while((c = getchar()) != '\n' && c != EOF);
Run Code Online (Sandbox Code Playgroud)

但今天我偶然发现了我在cflplus.com上关于fflush注意到的这一行:

fflush()...在打开以进行更新的文件中(即,打开以进行读取和写入),在执行输入操作之前,应在输出操作之后刷新流.这可以通过重新定位(fseek,fsetpos,rewind)或通过显式调用fflush来完成

事实上,我已经多次阅读过了.所以我想确认一下,我是否可以简单地使用以下任何一种方法,scanf()以便在fflush(stdin)支持时提供同样的服务:

fseek(stdin,1,SEEK_SET);
rewind(stdin);
Run Code Online (Sandbox Code Playgroud)

PS rewind(stdin)似乎非常安全,可以刷新缓冲区,我错了吗?

错误我应该提到,fseek(stdin,0,SEEK_SET)如果我们正在讨论,stdin因为我们不能使用0或0之外的任何偏移量ftell().

c fseek fflush input-buffer

6
推荐指数
1
解决办法
2960
查看次数

如何在按键后立即读取终端的输入缓冲区

我想在我的c程序中读取箭头按键并用其他字符串替换它们(立即在终端本身中).我正在尝试在unix终端中实现bash历史记录功能.我写了这段代码.

int
main(int argc, char *argv[])
{
    char c;
    char str[1024];
    int i = 0;
    while((c = fgetc(stdin)) != '\n'){
      if(((int)c) == 27){
        c=fgetc(stdin);
        c=fgetc(stdin);
        if (c == 'A')
        {
          printf("%c[A%c[2K",27, 27);
          printf("UP");
        }
      }
      str[i++] = c;
    }
    printf("\n");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为终端等待换行符或EOF将输入缓冲区发送到stdin.所以,我必须按回车键/返回键来分析用户输入.

在这个答案中,用户提到使用system ("/bin/stty raw");但这取代了所有默认的终端行为(例如退格,删除等).

那么,有没有什么方法可以直接读取/操作终端输入缓冲区并在检测到箭头按键时调整缓冲区本身?

环境 - Ubuntu(Linux)

更新1:是否有更改信号/中断的方法(默认是按输入键),使终端将存储的输入发送到缓冲区?这也可以帮助我实现相同的行为.

最终守则:

我通过检查输出来找到特定按键的ASCII字符 strace bash

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

#define ESCAPE '\33'
#define BACKSPACE '\177'
#define …
Run Code Online (Sandbox Code Playgroud)

c linux stdin input-buffer

3
推荐指数
1
解决办法
2322
查看次数

为什么“queueInputBuffer”中的“MediaCodec CodecException”仅发生在 Android API 29 上?

基本信息

目标SDK版本28

目标:课程的目标是在发送到我的服务器之前调整视频大小。

问题:应用程序仅在 API 29 上崩溃,无论是使用真实设备还是使用 AVD。例如,该代码在Pixel 2 API 28上运行良好,但在Pixel 2 API 29上运行不佳

源代码:我主要使用来自bigflake.com的示例代码。

错误信息(详细日志见下文):

E/AndroidRuntime: FATAL EXCEPTION: Thread-20
    Process: com.myapp.myapp, PID: 9189
    android.media.MediaCodec$CodecException: Error 0xfffffff3
        at android.media.MediaCodec.native_queueInputBuffer(Native Method)
        at android.media.MediaCodec.queueInputBuffer(MediaCodec.java:2450)
Run Code Online (Sandbox Code Playgroud)

我尝试过的 由于 的日志信息有限,我尝试从 更改为MediaCodec$CodecException,但没有成功。MediaCodecInfo.CodecCapabilities.COLOR_FormatSurfaceMediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible


日志将显示最后两个缓冲周期。我希望你能看到一些有价值的东西。

无法在 *Pixel 2 API 29* 上运行的日志

D/VideoResolutionChanger: no audio encoder output buffer
D/VideoResolutionChanger: loop: V(true){extracted:49(done:false) decoded:45(done:false) encoded:43(done:false)} A(true){extracted:45(done:false) decoded:44(done:false) encoded:1(done:false) pending:-1} muxing:true(V:0,A:1)
D/VideoResolutionChanger: video decoder: returned input buffer: 3
    video …
Run Code Online (Sandbox Code Playgroud)

android video-encoding input-buffer mediamuxer android-mediacodec

3
推荐指数
1
解决办法
4016
查看次数

使用C中的scanf()连续读取两个字符

我试图从用户输入两个字符t.这是我的代码:

int main()
{
    int t;
    scanf("%d",&t);
    char a,b;

    for(i=0; i<t; i++)
    {
        printf("enter a: ");
        scanf("%c",&a);

        printf("enter b:");
        scanf("%c",&b);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,第一次输出是:

enter a: 
enter b:
Run Code Online (Sandbox Code Playgroud)

也就是说,代码不等待值a.

c input scanf character input-buffer

2
推荐指数
1
解决办法
3206
查看次数

scanf() 失败后如何清除输入缓冲区?

scanf()我的程序中的输入缓冲区有问题。

首先我要求用户输入:

char someVariable;
printf("Enter text: ");
scanf(" %c",&someVariable);
Run Code Online (Sandbox Code Playgroud)

然后我有一个循环,一次遍历输入一个字符,scanf()直到到达换行符。

问题是,循环完成后,不知何故,缓冲区中仍然有一些东西,因此这个函数(在循环中被调用)被再次调用并破坏了我程序中的逻辑。

如何强制清除输入缓冲区?

我只能使用scanf()(作业要求)

void checkType(){
    char userInput;
    char tempCheckInput;
    printf("Enter Text: ");
    scanf(" %c",&userInput);
    while (userInput != '\n'){

        tempCheckInput = userInput;
        scanf("%c",&userInput);
Run Code Online (Sandbox Code Playgroud)

忽略循环结束;这是我获取输入的部分。

c scanf input-buffer

2
推荐指数
1
解决办法
171
查看次数

输入缓冲如何在 C++ 中工作

这是一个代码片段。我对内部缓冲的工作方式感到困惑。

  while(true)
  {
      cout << "Enter a character: ";
      cin.ignore(3, '\n');
      ch = cin.get();  // ch is char type
      cout << "char: ch: " << ch << endl;
  }
Run Code Online (Sandbox Code Playgroud)

实际上cin.ignore(3, '\n')忽略前三个字符,然后获取下一个直接字符。到那一点就好了。因为,我把它保持在一个while循环中,我试图检查ignore()and的行为get()。例如,我检查的输出是

Enter a character: abcd
char: ch: d
Enter a character: efgh
char: ch: e
Enter a character: ijkl
char: ch: i
Enter a character: mnopq
char: ch: m
Enter a character: char: ch: q
Enter a character: 
Run Code Online (Sandbox Code Playgroud)

只是为了检查缓冲,我故意给了 4 个字符而不是 1 …

c++ inputstream input-buffer

1
推荐指数
1
解决办法
4730
查看次数