当前位置:首页 » 编程语言 » c语言文件缓冲区

c语言文件缓冲区

发布时间: 2022-03-31 16:41:29

c语言里如何设置缓冲区,

很简单的定义一个数组,用两个变量下标来指向头和尾,新数据来尾++ 老数据处理完头++ 两个下标超过界限时从头开始循环利用 中间要考虑缓存数据空和数据满的情况

或者你动态分配空间,来一个信号分配空间,插入队列链表,处理完一个出队列,释放空间

② C语言中如何清空输入输出缓冲区

最简单的是用fflush()函数。
此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。
函数原型:int fflush(FILE *stream) ;
函数功能:清除一个流,即清除文件缓冲区.
常用场合:
一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)

三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写
FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);

③ C语言中fread函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题

fread在fp_in缓冲区中剩余字节为0的时候才会产生一个异常让内核去处理,内核收到这个异常,就会读取文件,将fp_in的缓冲区重新填满。
也就是说:如果只剩下15个了,你要读20个,那么就会先读15个到g_buffer里,然后产生一个异常,内核重新填满缓冲区,然后再从缓冲区里读5个字节。

④ c语言在文件缓冲区里提前显示的函数是什么

int fflush(FILE *stream)

调用这个函数即可

⑤ C语言里如何设置缓冲区

将数据以链表形式顺序存放,新数据总是放在表尾,待处理的数据总是在头结点下的第一个结点,处理完毕则释放空间。

#define BufferSize 1024 // 合适的大小你知道的
typedef struct node {
char *buffer;
struct node *next;
}*linkList;

LinkList *InitList() {
LinkList *head;
head = (char *)malloc(size(node));
head->next = NULL:
return head;
}

void AddData(LinkList *head, char *data) { // 将新数据添加到表尾
LinkList *p = head;
LinkList *anode = (char *)malloc(size(node));
anode->buffer = (char *)malloc(size(BufferSize));
strncpy(anode->buffer,data,BufferSize);
anode->next = NULL:
while(p->next) p = p->next;
p->next = anode;
}

void DealData(LinkList *head) {
LinkList *p = head->next;
if(p) {
head->next = p->next;
// p->buffer指向的数据待处理
free(p->buffer); // 处理完毕,释放空间
free(p);
}
}

⑥ C语言缓冲区在哪里

缓冲区具体在哪里是与操作系统、编译器相关的
以VC++为例。察看getchar的源代码(src\fgetchar.c),有:
int
__cdecl
_fgetchar
(void){
return(getc(stdin));
}
#undef
getchar
int
__cdecl
getchar
(void){
return
_fgetchar();
}
可见getchar()相当于getc(stdin)
继续察看getc(src\fgetc.c),有一段(为便于阅读,有删减):
int
__cdecl
getc
(FILE
*stream){
int
retval;
_ASSERTE(stream
!=
NULL);
_lock_str(stream);
__try
{
retval
=
_getc_lk(stream);
}
__finally
{
_unlock_str(stream);
}
return(retval);
}
这段代码里_lock_str其实是通过Win32
API提供的临街区来锁住文件
接收用户输入发生在_getc_lk,_getc_lk宏调用_filbuf。_filbuf在_filbuf.c中可以查看,这段代码比较长,就不贴出来了
_filbuf主要是调用了_read(_fileno(stream),
stream->_base,
stream->_bufsiz)
而_read最终则是调用了Win32API
ReadFile,以下是用WinDbg输出的getchar的调用栈:
#
ChildEBP
RetAddr
00
0012fe6c
0040a4e7
kernel32!ReadFile
01
0012fea8
0040a3b9
TestStruct!_read_lk+0x107
[read.c
@
146]
02
0012fec0
00403140
TestStruct!_read+0x69
[read.c
@
75]
03
0012fee8
00401290
TestStruct!_filbuf+0xd0
[_filbuf.c
@
127]
04
0012ff08
004012cc
TestStruct!fgetc+0x80
[fgetc.c
@
44]
05
0012ff14
0040103d
TestStruct!getc+0xc
[fgetc.c
@
56]
06
0012ff20
00401058
TestStruct!_fgetchar+0xd
[fgetchar.c
@
37]
07
0012ff28
0040101e
TestStruct!getchar+0x8
[fgetchar.c
@
47]
08
0012ff80
0040115c
TestStruct!main+0xe
[d:\my
programs\teststruct\ts.cpp
@
4]
09
0012ffc0
7c816fe7
TestStruct!mainCRTStartup+0xfc
[crt0.c
@
206]
0a
0012fff0
00000000
kernel32!BaseProcessStart+0x23
可见,getchar最终调用了ReadFile。关于ReadFile的原理以及缓冲区在哪里,请你再提一个问我再回答

⑦ C语言中,什么是缓冲文件系统和文件缓冲区

目前c语言使用的文件系统分为缓冲文件系统(标准i
/
o)和非缓冲文件系统(系统i
/
o)。缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执
行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。
因此当程序运行时虽然进行了写数据操作,但是如果写入的数据没有装满内存中的缓冲区,就不会将数据写入到磁盘文件中。当程序运行结束后,系统就会将缓冲区中的数据写入到磁盘上的文件中,因此就可以看到文件中的内容。
常用的fopen命令就会使用文件读写缓冲区,fclose命令关闭文件,把缓冲区中的内容写入磁盘上的文件中。详见:
http://study.qqcf.com/web/171/19812.htm

⑧ C语言 关于缓冲区的条件判断

首先你要知道对于计算机而言,在取输入的数据的时候是有个缓冲区的,用于将用户读入的素具进行存储,实际上就是一个队列;
对你的第一个问题:
int ch1=getchar();
int ch2=getchar();
int ch3=getchar();
在你输入9回车6回车,那么此时缓冲区的字符数据为入 9回车6回车(实际上计算机认为你输入的是字符9和6,因为getchar是针对字符的,由于你定义的是int型,因此计算机会自动转换为它的ASC码,也就是一个整数,再你输出的时候又是以字符串的形式输出的,计算机又将这个整数(也就是当时的ASC码)转换为字符,这两个转化不用你管,计算机有这个功能称为自动转化),由于getchar是取的单个字符,因此它只取走了前三个字符9 回车 6 最后还有一个回车符停留在缓冲区,那么在用户下一次输入的时候计算机就首先会从回车符开始;
在你输入9空格6空格3回车,情况和上面一样,只是缓冲区里面存放的是 空格 3 回车了,前面的三个都被取走了,那么在用户下一次输入的时候计算机就首先会从空格开始;

对你的第二个问题:
你的想法很美好,但是你忽略了一个事实,
while ((c = getchar()) != '\n')
printf("%c", c);
while循环一定会执行一条语句,而且直到遇到第一个语句块(一般为遇到一个分号,但是if-else除外,因为if-else对计算机而言是一个整体,也就是一个语句块),也就是说当你输入 字符c 回车符的时候,缓冲区里存放的是 c 回车符 ,但是此时计算机会逐个检查你的输入,首先检查c 它不是回车符就printf("%c", c);将c打印出来,然后发现后面还有字符回车,检查一下不符合要求就退出循环,不执行下面的printf("%c", c)(此时的变量c为回车符),因此组后显示的就是一个字符c,关于中间的两次转换和第一个问题的回答是一样的;
还有什么不懂的可以继续交流~~~

⑨ C语言中,求内存缓冲区的详细解释!

缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。也就是说,在内存中预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲区。
      缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

⑩ C语言中setvbuf函数为一个文件创建缓冲,把文件读取到程序的时候,是不是把数据存储在这个缓冲区



必须是有个全局可操作的内存区域。

热点内容
安卓搜狗输入法哪个版本 发布:2025-01-17 08:55:34 浏览:338
素材包加密 发布:2025-01-17 08:55:22 浏览:134
微信相册怎么加密 发布:2025-01-17 08:53:26 浏览:370
安全加密配置成功是什么 发布:2025-01-17 08:49:40 浏览:856
直流电存储 发布:2025-01-17 08:47:33 浏览:552
容声冰箱压缩机多少钱 发布:2025-01-17 08:18:38 浏览:886
微信怎么取消密码怎么设置 发布:2025-01-17 08:06:18 浏览:793
如何帐户密码 发布:2025-01-17 07:56:11 浏览:612
服务器内网ip地址安全 发布:2025-01-17 07:33:18 浏览:186
华为新算法 发布:2025-01-17 07:31:43 浏览:56