① C语言缓冲区的问题:下面是代码
输出缓冲区:
c标准规定fflush()函数实现,用来刷新输出(stdout)缓存的,对于(stdin)是么有意义的,gcc也不能使用fflush(stdin)来刷新,因为gcc么实现它。
那么为什么要刷新呢,个人认为是这样的
打个比方getchar()函数,我们知道他是从界面读取用户输入的字符,读取之后编译器就把它放在缓存中,当达到一定值的时候,才写入文件什么的,或者我们自己主动调用函数写进去,这个时候如果你还要读取字符到另一个文件中,你会发现这个时候不是你要写入文件的字符,这个时候你就应该刷新下缓存。
打个比较典型的比方:
char
p[]={“a”,“b”,“c”};
printf("%d",strlen(p));
我们发现输出的数值不是我们想象的3,为什么,这就是缓存的问题,因为数组p的结束符不是‘/0’,系统会从缓存里面一直读,根据我的理解如果先刷新下缓存,应该就是3了
对于lz的例子我觉得好像么什么问题,如果要加刷新缓冲,那我觉得可能是,你sleep(1)的时候,其他程序开始占用cpu,导致缓存发生变化,导致输出不正常
刷新缓存在tcp和udp通讯的时候用的很多,lz可以看看这方面资料
② 如何清理电脑缓存
1、运用磁盘清理软件清理C盘,大约可为C盘释放50M-800M空间。
2、关闭休眠功能,在开始菜单的运行里输入 powercfg -h off 指令,关闭休眠,此文件实际大小和物理内存是一样的,大约可以为C盘释放1-3G的空间。
3、设置虚拟内存: 计算机属性>高级系统设置>设置(性能)>高级选项卡>更改(虚拟内存),将C盘设置为无分页文件,然后把D盘设置成系统管理的大小即可,更改后只有按“设置”按钮才能生效,最后重启便完成了设置,此文件默认为物理内存的1.5倍,大约可为C盘释放2-4G的空间。
4、删除自动备份文件,运行cmd程序(在“开始–>程序–>附件”中),鼠标右键选择“以管理员身份运行”;然后,命令行输入 rd/S/Q c:WINDOWS.OLD
,提示确认是否删除目标文件夹,输入y然后回车即可。WINDOWS.OLD为系统的备份文件,时间越久就越大,超过10G都是很正常的。大约可为C盘释放3G以上空间。
5、把C盘的软件清理一下,没用的通过控制面板——程序和功能删除掉,大约可为C盘释放50M以上的空间。
6、在完成了C盘瘦身以后,记得要保持良好的习惯,例如:桌面不要放过多的东西、定期为C盘等分区进行磁盘碎片整理。
C盘其他可以删除的文件。
1、C:\Documents and settings\用户名\Local settings\temp\下的所有文件可以删;
2、C:\Documents and setting\用户名\cookies\所有文件可以删;
3、C:\Documents and settings\用户名\Local settings\temporary internet Files\下所有文件(页面文件)可以删;
4、C:\Documents and settings\用户名\Local settings\Histoy\下的所有文件(历史记录)可以删;
5、C:\Documents and settings\用户名\Recent\下的所有文件(最近浏览文件的快捷方式)可以删;
6、C:\WINDOWS\Temp\下的所有文件(临时文件)可以删(c盘哪些文件可以删除);
7、C:\WINDOWS\ServicePackFiles\ 下的所有文件(升级后的备份文件)可以删;
8、C:\WINDOWS\SoftWareDistribution\download\ 下的文件可以删;
9、C:\WINDOWS\System32\dllcache\下dll文档,这是备用的dll文档。
10、C:\WINDOWS\driver cache\i386\下的(硬件的备份文件)可以删。
11、如果进行了windows updade升级那么C:\windows\以下$u开头的隐藏文件都可以删除。
③ 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盘缓存文件夹名称
1.打开“我的电脑”-“工具”-“文件夹选项”-“查看”-在“显示所有文件和文件夹”选项前打勾-再按“确定”
2.删除以下文件夹中的内容:
C:\Documents and Settings\用户名\Cookies\下的所有文件(保留index文件)
C:\Documents and Settings\用户名\Local Settings\Temp\下的所有文件(用户临时文件)
C:\Documents and Settings\用户名\LocalSettings\TemporaryInternet Files\下的所有文件(页面文件)
C:\Documents and Settings\用户名\Local Settings\History\下的所有文件(历史纪录)
C:\Documents and Settings\用户名\Recent\下的所有文件(最近浏览文件的快捷方式)
C:\WINDOWS\Temp\下的所有文件(临时文件)
C:\WINDOWS\ServicePackFiles(升级sp1或sp2后的备份文件)
C:\WINDOWS\Driver Cache\i386下的压缩文件(驱动程序的备份文件)
C:\WINDOWS\SoftwareDistribution\download下的所有文件
⑤ 如何在C/C++程序中运用双缓存双线程等大规模数据处理的技巧 或者要怎么做可以一次调入一块数据进行处理
线程技术主要是用来并行处理一些任务,这些任务之间一般少有逻辑顺序上的关联,所以用线程技术可以提高程序整体的运行速度,特别在其中一些子线程运行速度有很大差距的情况下。
各类软件使用缓存的方式都不一样。双缓存或者多个缓存、缓存池等等方式都有。关键在于你的程序需要使用怎样的缓存结构。比如说你是类似生产者消费者模型的软件,你也许会使用多个缓存做成队列,一头在不断填充,一头则不断消耗,这样能大大提高整体的数据吞吐速度。
fread不输入整块调入,它底层是使用的read之类的函数,对文件句柄进行操作。gets函数则是对指针指向的内存地址操作。这些都是上层逻辑了,离磁盘寄存器很远。真正加快文件读取速度的方法有很多,比如把整个文件映射到内存里,又比如跳过磁盘缓存直接大块读取内容。这些有的有专门的API函数可用,有的则需要你自己改写系统底层代码。
建议你多看看操作系统原理方面的书,可以去试着学习下linux内核代码和原理,这样你对这些问题就会有更深的认识。
希望这些建议能帮助你。