优秀网站的特点,百度官网首页官网,山东省城建设计院网站,为企业做好服务保障今天在复习UNIX文件系统#xff0c;用到那个read函数#xff0c;但是无意中却掉到一个坑里了#xff0c;用了一个多小时才找到问题根源#xff0c;这里记录一下。 问题是这样的#xff1a;我需要使用read和write函数把键盘输入的信息复制到输出。所以我写了如下程序#… 今天在复习UNIX文件系统用到那个read函数但是无意中却掉到一个坑里了用了一个多小时才找到问题根源这里记录一下。 问题是这样的我需要使用read和write函数把键盘输入的信息复制到输出。所以我写了如下程序 #include #define MAXSIZE 10 int main(void) {charc;charbuf[MAXSIZE];intn;while((n read(0,buf,MAXSIZE)) 0)//海燕高尔基在苍茫的大海上狂风卷积write(1,buf,n);//从buf中输出n个字节的信息到标准输出中return 0; } 输入”HelloWorld“检测好像没问题。但是当我输入”海燕高尔基在苍茫的大海上狂风卷积“却发现不太对了这是个什么操作 HelloWorld HelloWorld 海燕高尔基在苍茫的大海上狂风卷积 海燕高尔基海上狂风卷 为什么后面那个它中间有几个字掉队了经过多次测试我发现如果输入的是英文字符就没问题而中文字符字节数只要超过了那个MAXSIZE就会出问题。我一度认为是因为读取一次read后内存中数据对齐导致的所以我换了几种组合中文加英文但是还是有问题。于是没办法只能去读函数的原型和定义的相关描述了。函数的原型是长下面这样的 ssize_t read(int fd, void *buf, size_t count); 该函数每次调用成功返回读取的字节数出错返回-1并设置errno如果在调read之前已到达文件末尾则这次read返回0。参数count是请求读取的字节数读上来的数据保存在缓冲区buf中同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同这个读写位置是记在内核中的而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。 为了检测我读取到的到底是多少个字节我把程序修改如下 #include #define MAXSIZE 10 int main(void) {charc;charbuf[MAXSIZE];intn;while((n read(0,buf,MAXSIZE)) 0)//海燕高尔基在苍茫的大海上狂风卷积 { printf(%d\n,n); write(1,buf,n);//从buf中输出n个字节的信息到标准输出中 putchar(\n); }return 0; } 我很疑惑的发现每次读到的的确是MAXSIZE个字节的数据也把这对应的数据输出了但是在一次循环后中间还是跳过了MAXSIZE个字节的数据没输出。 海燕高尔基在苍茫的大海上狂风卷积10海燕高尔基10海上狂风卷 到底是什么导致了这一现象呢我怀疑是字符与字节的问题但是说不上到底是那个函数在处理这个出问题了。所以我另外写了一个函数测试。 #include int main(void) {char buf[4];charc ;inti;for(i 0;i 3;i) { read(0,buf,2); buf[2] \0; printf(%s\n,buf); read(0,buf,2); buf[2] \0; printf(%s\n,buf); } } 我三次分别输入 ”好的\n 好的h “好hj”其输出如下 好的 好 好的h 好 h 好hj 好 j 我发现其实在读取的时候数据是没有任何问题的一个中文占了两个字节所以第一组测试数据的两个字节读了前两个字节 好 字并输出了但是它下一个竟然不是读第三个字节和第四个字节的 的 字而是把回车读进去并输出了(每次输出都本来会输出一个空格这里共输出了四个空格) 而第二组测试数据也是首先读两个字节输出 好 而第二次读取的两个字节分别是 h 和 \n 。 第三组数据前两个字节读的是 好 而后两个字节读的分别是 j 和 \n 。 其实到这里问题已经不难看出了当我们使用read函数去读取数据时它会按照你提供的count去读取count个字节的数据同时文件指针后移但是文件指针移动并非是以字节为单位来移动的而是以字符为单位来移的。(这里说的字符并非只是char类型的还包括了宽字符。我把它们都叫字符)。所以这也就导致了我最开始的那个错误。 海燕高尔基在苍茫的大海上狂风卷积10海燕高尔基10海上狂风卷 它读取了10个字节的数据也就是读到了5个中文字然后它把文件指针往后移动10个字符所以在第一次调用read函数之后文件指针已经指向了第十一个字符也就是 海 字。所以下一次读取就是从这个位置开始了。 标签 版权申明本站文章部分自网络如有侵权请联系west999comoutlook.com 特别注意本站所有转载文章言论不代表本站观点本站所提供的摄影照片插画设计作品如需使用请与原作者联系版权归原作者所有