缓存c语言
1. c语言缓冲如何编写。
这是我的函数,random.txt里面是1到1000随模孝机排列的数,问题是如何加入缓冲,使得缓冲区每回只能进去20个数字,然后出缓冲区,出来50行。
你这个要求翻译成程序可大可小
简单点来说
#define CacheSize 20
typedef struct cacheItem{int value; char bUsed;} CacheItem;
CacheItem Cache[CacheSize];
CacheItem *pOut=0;
CacheItem *pInput=iCacheArray;
int iCacheLocker=-1;
FILE *fsInputFile = 0;
int bIsJobDone=0;
void threadInput()
{
读取一个数字
锁定cache
判定当前输入cacheitem是否可写可以的话写入,
如果可写pInput->value,pInput->bUsed=1;if(pInput == (Cache+CacheSize))pInput=iCacheArray;else ++Ipnut;
否则停留在当前读取的位置,等答羡待输出线程释放出缓存空间。
释放cache的锁定
如果读取个数达到要求了或者文件末尾,++bIsJobDone;return;
}
void threadOutput()
{
锁定cache
判定当前输入cacheitem是否bUsed,如果可有用,输出pInput->value,pInput->bUsed=0;++pOutput;
如果不可用 判定读取线程是否结束了bIsJobDone==1?(++bIsJobDone):bIsJobDone;
释放cache的锁定旦举稿
如果bIsJobDone==2,结束输出线程 return
}
void main()
{
open文件
创建输入线程
创建输出线程
while(bIsJobDone!=2);
}
大意如此,你明白撒?
2. C语言中怎么实现数组的缓存
数组一旦申请了维度是不能更改的。要想改变大小,可以考虑容器,像vector,list等。那可以删除和拼接。
3. C语言缓存问题:
scanf会跳过空白符,除非是%c。所以你getchar遗留下来的换行被scanf跳过
4. C语言中关于键盘缓存区问题
说是 以字符串的格式存储也可以,但不太准确。
实际上 getchar 是执行这样一个操作,fgetc( STDIN ),从标准输入 STDIN 文件中读取一个字符。
这个STDIN是让册以文件形式存在的,而且是带有缓冲的文件。所以准银滑旅确的说你的输入被组织锋凳成一个文件形式。
5. C语言 缓存文件读取代码问题
这里的num表示文件中有效数据的个数。
如果num == -1,那么for循环读取文件数据的条件就不会满足,也就是说,如果过num < 0,for循环就不会执行。
6. 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的原理以及缓冲区在哪里,请你再提一个问我再回答
7. c语言传文件清空缓存
scanf("%*[^\n]");
^取反或者“非”,[^\n]就是除了回车什么都可以被scanf读到。*表示被读到了但是不把读到值或者字符赋值给任何变量。
%*[^\n]就是读取来自键盘的出去回车外的任意字符,并不赋值给变量。
scanf("%*c");
就一个*,和上边表示一样就是读到了不赋值给任何变量。
再看,scanf("%[^\n]%*c",str)读入一行字符,赋值给str变量。如果c前面没有*,那么就需要str后面再写一个char类型的ch。这就告诉*表示读到了但是不赋值给任何变量。
那么scanf("%*[^\n]%*c")这句话,应该能理解了,两个格式控制符里面都有*,就是都读到了都不赋值变量。
读到这里应该差不多理解了,就是题中的两句scanf(相当于scanf("%*[^\n]%*c"))读到了输入的abc,但是没有赋值给任何变量。然后到了gets(str4);读到了def赋值给str4,然后printf("%s\n", str4);后必然显示def。
清空缓存区用fflush(stdin);这句代码。
键盘输入的东西都是放在缓冲区的这款区域,有变量过来了就带走,没有变量就在那里呆着等待一个变量来带它走。但是这个时候缓冲区里面偶尔会有一些垃圾的字符,而影响了正常的输入,有的时候用getchar()带走一个两个的字符,但是如果还是不见效一句fflush(stdin);就可以了。
8. C语言中如何将结构体中的值赋给BYTE类型的缓存
C语言中将结构体给BYTE缓存赋值时,直接进行拷贝即可。
结配扮构体在内存中是一段连续的内存空间,BYTE缓存(即BYTE数组)也纳陆是一段连续的内存空间,直接进行内存拷贝就可以完成赋值操作。
例如:
struct A {
int a;
short b;
} dataStruct;
BYTE dataBuffer[20];
memcpy(dataBuffer, dataStruct, sizeof(struct A)); //对Byte缓存赋值
memcpy(dataStruct, dataBuffer, sizeof(struct A)); //对结构体赋洞卖顷值
9. C语言里如何设置缓冲区,
很简单的定义一个数组,用两个变量下标来指向头和尾,新数据来尾++ 老数据处理完头++ 两个下标超过界限时从头开始循环利用 中间要考虑缓存数据空和数据满的情况
或者你动态分配空间,来一个信号分配空间,插入队列链表,处理完一个出队列,释放空间
10. C语言的输入缓冲怎么回事,哪里有详细介绍啊
缓冲是标准C中的标准I/O里的机制,标准库里的I/O语句为了提高读写的效率,在实际读写之前将数据保存到一段内存中,这段内存就叫缓冲,分全缓冲,行缓冲两种,全缓冲在缓冲的内存满了之后做实际的读写,行缓冲在遇到换行符之后做实际的读写,unix高级环境编程里第五章里有详细的说明,或者网络也有