C调用read的乱码问题

发现自己真的被各种高级语言宠坏了。玩C还真的各种不懂的。

问题

例如下面的代码可以正确输出,但将

ret = readfile (fd, buf, len);

换成

readfile (fd, buf, len);

输出就变乱码了。

不懂啊。(:з」∠)

1#include <stdio.h> 2#include <string.h> 3#include <errno.h> 4#include <sys/types.h> 5#include <sys/stat.h> 6#include <fcntl.h> 7#include <unistd.h> 8 9// ssize_t readfile(int fd, void* vBuf, size_t len){ 10ssize_t readfile(int fd, char* vBuf, size_t len){ 11 char* pBuf = vBuf; 12 ssize_t ret, total; 13 14 while (len != 0 && (ret = read (fd, pBuf, len))!=0){ 15 if (ret == -1){ 16 if (errno == EINTR) 17 continue; 18 perror("read"); 19 break; 20 } 21 len -= ret; 22 pBuf += ret; 23 total += ret; 24 } 25 return total; 26} 27 28int main(){ 29 int fd; 30 //打开文件 31 fd = open ("test.txt", O_RDONLY); 32 if (-1 == fd){ 33 perror("open file failed"); 34 return -1; 35 } 36 char buf[512]; 37 size_t len = 200; 38 ssize_t ret; 39 40 ret = readfile (fd, buf, len); 41 printf("%s\n", buf); 42 return 0; 43} 44

补充

  • void*改成char*编译器就不会报warning,但不影响结果
  • 以上问题在ubuntu下发现,换openSUSE没问题(gcc (SUSE Linux) 4.6.2),win7 x64下char buf[512];改成char buf[200];也没问题。
  • ubuntu下将char buf[512];改成 char* buf;可以得到正确结果,但同样代码(改char* buf)扔到windows下的gcc (tdm64-1) 4.7.1则报异常。扔到openSUSE在perror那行输出Bad Address错误
  • 我要学学gdb调试一下了
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

C调用read的乱码问题 - HelloWorld