免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1788 | 回复: 1
打印 上一主题 下一主题

read系统调用如何处理dos格式文本下的换行符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-17 13:16 |只看该作者 |倒序浏览
测试代码如下

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main(void)
  4. {
  5.         char buf[40];
  6.         int fd;
  7.         int i;
  8.         ssize_t nRead;

  9.         if ((fd = open("test.txt", O_RDONLY)) == -1)
  10.         {
  11.                 printf("open error");
  12.                 exit(0);
  13.         }

  14.        
  15.         if ((nRead = read(fd, (void *)buf, 11)) != 11)
  16.         {
  17.                 printf("nRead = %d\n", nRead);
  18.                 printf("sorry, read from test.txt error\n");
  19.                
  20.         }
  21.         else
  22.         {
  23.                 for(i = 0; i < 11; i++)
  24.                         printf("i = %2d, buf[i] = 0x%x\n", i, buf[i]);       
  25.         }
  26.         exit(0);
  27. }
复制代码


只要test.txt文件中的前11个字符中含有换行符,运行结果就是sorry, read  from test.txt error
后来我使用dos2unix工具将test.txt文件进行了格式转化,就能正确读取了

没搞明白的是虽然DOS格式下换行符使用 0d 0a两个bytes来表示而UNIX 格式使用0a一个字节来表示
但这不应该会影响read系统调用的返回值吧,没进行格式转化之前,read系统调用应该是读取了11个bytes啊,为什么它会返回10呢

论坛徽章:
0
2 [报告]
发表于 2008-12-17 13:45 |只看该作者
返回10,你就再发起一次read调用嘛

read的返回值可能是-1, 0, <=len

你的写法有问题,只有-1时才算是read出错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP