关于read函数
今儿一直纠结一个程序,突然发现了一个比较隐蔽的问题read函数的调用并非我的初衷.于是就简单地写了个例子程序测试了一下,望高手们多多指教!多谢!!!
例子程序是这样的:
int main(){
FILE* stream=fopen("a.txt","r"); //a.txt已经存在
int fd=file(stream);
char buf[5];
int nread=read(fd,buf,sizeof(buf));
}
其中 a.txt文件的内容如下:
abcd
ef123 //注意字符'3'是我写入的最后一个字符;之后没有回车键
该程序的结果显然是:一共读取了5个字符 abcd还加一个换行LF //这一结果在我意料之中
当我把buf的下标改成10时:一共读取了10个字符 a b c d LF e f 1 2 3 // 这结果也肯定在意料之中
当把buf的下标改成11或12或13时:一共读取了11个字符 a b c d LF e f 1 2 3 LF //这结果就出乎我的意料之外啦!!!
read函数它会自动加上一个换行符吗?还是遇到所谓的EOF就自动加上一换行符?还有就这个文件它的EOF是不是就在字符 3 的后面?这read函数背后到底隐藏着什么机制?
后来,我为了找到答案,把这个程序移值到windows平台下发现,windows却有着另外的一套机制,似乎更复杂,它把"回车换行键"似乎ACS成了2个字符LF 和 CR ,而且随着buf下标的变化,结果也变得有点儿离奇?!不过还是有规律的,就是找不出最终确切的解释!
各位前辈们还是帮我先看看LINUX下这个程序中我提到的几个问题吧,如果谁有对这个问题在windows有解释那更好了!!!呵呵...多谢了!!!
[解决办法]
你在linux测试一下这两段代码应该就明白了。不是read的问题,而是你编辑a.txt的编辑器的问题,编辑最后行的时候,你是没加上换行,但编辑器帮你加上了。我用的vim就是这样。另外你可以用od -c a.txt这个命令看看。
#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>/*intmain(int argc, char *argv[]){ struct stat fst; if (-1 == stat("tmp.txt", &fst)) return 1; printf("%ld\n", fst.st_size); return 0;}*/intmain(int argc, char *argv[]){ int fd, cnt; char buf[] = "abcd\nef123"; if ((fd = open("tmp.txt", O_WRONLY | O_TRUNC)) == -1) return 1; cnt = write(fd, buf, 10); printf("%d bytes writed\n", cnt); return 0;}
[解决办法]
你在linux测试一下这两段代码应该就明白了。不是read的问题,而是你编辑a.txt的编辑器的问题,编辑最后行的时候,你是没加上换行,但编辑器帮你加上了。我用的vim就是这样。另外你可以用od -c a.txt这个命令看看。
windows下同样也是这样的。
[解决办法]
vim里敲一下回车就一个\n,没什么问题。
[解决办法]
vim里可以:set list看一下最后一行是不是一个$的空行。