首页 > 编程知识 正文

计算机汇编语言是一种(unix常用基本命令)

时间:2023-05-06 13:48:20 阅读:67002 作者:3748

前辈,你在吗? @中山野鬼@stxy0509你能帮我看看这个问题吗? ######

@stxy0509######

老实说,你@我之前,我看过你这个问题,但我觉得很麻烦。 我自己也觉得做不到,所以不敢开口。 但是,成为你@,站不起来的有点像乌龟……

mes1和mes2信息都输出到stdout时,其末尾会附加换行符”。 这确实不应该。 我在Windows上用vs2010试了一下,但没有。 我不知道linux为什么是这样。

2 “stdout是行缓存。 (即使在本机上试过也确实如此。 )”那么,你怎么证明那个? h也许你真的证明了,但那只能说linux的行为对我来说有点莫名其妙。

fclose ) )你认为另一个文件会迫使stdout输出吗? 但是,为了实际证明这一点,请注释掉fclose ()并尝试一下。 我说的可能不对。

3“输入文件的缓冲器似乎与stdout终端的缓冲器没有直接联系”,肯定是这样。 即使要取得联系,程序也在让他们取得联系。 否则,不会混乱吗?

4文件以“r”模式打开,文件是完整缓冲区。 如果使用fread ()或其他读取函数(而不是自动填充缓冲区内容),系统将自动将读取内容放入此缓冲区并返回读取函数。 如果下一个读取的数据仍是此缓冲区范围内的数据,则直接从该缓冲区复制,不直接读取文件。 但是,如果超出范围,则实际读取文件并再次更新缓冲区。

5根据我所知的资料,fflush ) )将缓冲器中的数据刷新到磁盘(真正的写入)。 对于以读取模式打开的文件,应该不需要同步。 因为即使完全没有文件也无法修改。

6文件可以同时作为读和写打开。 线程通信的一种方式通常是一个线程写文件,另一个线程从该文件读取文件。 只要文件指针(读写位置)保持正确即可。 其实,要在windows下的文件中这样做,打开时必须共享读写,不能独占访问。 但是,简单的c库函数做不到这一点。 是否可以,交给天命(请检查读写此文件的其他进程是否设置了共享)。

7“如果可能的话,我应该申请两个不同的缓存区域吗? 我想说的是FILE *指针对应于缓冲区。 如果只有一个,那就不是胡说八道了。 写下你在扰乱我,我会扰乱你。 经常从常识、原理的角度考虑问题、常识、原理,程序也应该这样做。 否则,程序也有问题。

我希望对你有帮助!

######

FILE结构只维护一个缓冲区。 如果对一个文件调用fgets函数并到达特定位置,则此时尝试写文件将需要fseek(FP,0,SEEK_CUR )来清空缓冲区,然后调用写函数。

可以去看unix环境的高级编程。 第一章写得非常清楚。 ######

关于第一个问题,我使用vim创建mest1和mest2时会出现与楼主相同的换行,如果

printf hello mest1

打印玛丽! mest2这样创建时不会出现换行。

用hexdump去看用vim制作的mest1时,文件的末尾出现了奇怪的东西,应该是文件编辑器的问题。 不关代码的事吧######

问题解决了。 总结。 1 .问题的根源在于@正如坦率的信封所说,在名为vim的文本编辑器中。 百度查看后,vim会自动在自动创建的文本的每一行末尾添加换行符(如果该行末尾本身没有换行符)。 如果想消除这个自动换行,可以在vim的命令模式中依次输入“set noeol”和“set binary”。 (后面的这个“set binary”默认情况下处于关闭状态,但打开它似乎会引起其他问题。 这需要研究)。 点击命令后,' :w '保存提示文本的字符数正好是您输入的数字(不会额外添加一个换行符)。 2 .缺省情况下,stdout和stdin为行缓存。 可以通过以下代码证明stdout是行缓存:

printf(Hello );

wile(1;

编译并运行此文件时,您会发现它不会输出,并且仍然停留在某个位置。 (while(1)的作用)此时的数据还未退出stdout的buffer,并且程序为main ) ),因此无法将flush buffer的内容发送到stdout终端。 但是,在printf('hellon ' )的情况下,由于stdout的buffer遇到换行符而将buffer的内容刷新到stdout终端,因此运行程序时会显示相应的“hello”输出。 3. input file的buffer (通过在“r”模式下以fopen打开文件生成的buffer )和通过在“w”模式下以fopen打开输出文件的buffer )文件生成的buffer ) 调用fclose ) (例如fflush(fp ) )函数时,fp是指向文件的文件指针,类型为FILE *。 fp调用fflush函数以“刷新”fp指向的文件的缓存区域。 这个“刷新”有两层意思。 对于input file缓冲区,缓存中尚未加载的内容将被销毁,而对于output file,将被销毁

来说,这会使得buffer中的内容写入到相应的输出文件中(写入disk或相应的设备文件,通过调用相应的system call)。

http://man7.org/linux/man-pages/man3/fflush.3.html 的description有说到这个问题。所以源码中的“fclose(fp)”并不会强迫stdout输出,他只是flush了input file 的buffer,并释放了fp这个文件指针以供下个input file使用。

4. 驻留在disk上面的文件一般为全缓存的。当以“r”模式用fopen打开此类文件时,system会为这个文件建立一个input buffer,而此时应该还不会立马将文件的内容读至buffer,而是等到真正要由该文件读取数据时才会通过system call将文件的数据填满这个buffer,然后再由这个buffer读取数据。 5. 文件可以同时被读和写("rw")。但这个要注意的东西很多,还没学到。。

最后,非常感谢

@stxy0509

@优游幻世 和

@直率的信封 。能抽时间看完我这累赘的叙述并且还给出了自己的看法,让我解决了一个大疑惑。一个人的能力和经验是有限的,大家不同的看法才能引起brain storm,更快地解决问题。有你们的支持,我才能走得更远。Thanks a lot~######和库有关。查一下相关库的说明。包括stdout。c标准里,对这些具体的操作方式,没有规定的。各家按照自己喜好来。本身c语言跨平台时,要注意的,就是这些。######

引用来自“中山野鬼”的答案

和库有关。查一下相关库的说明。包括stdout。c标准里,对这些具体的操作方式,没有规定的。各家按照自己喜好来。本身c语言跨平台时,要注意的,就是这些。

感谢野鬼前辈~我会注意的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。