开发者社区> 问答> 正文

关于linux下open函数的问题? 400 报错

关于linux下open函数的问题? 400 报错

我写一个socket传送文件程序,我先定义了一个char型buffer【100】,然后fgets(buffer,100,stdin),最后open(buffer,O_RDONLY),输入的是/mnt/hgfs/sky/a.txt,运行时,open失败,但是我直接把buffer换成"/mnt/hgfs/sky/a.txt",就打开成功了,请问第一个参数能照我这样给吗?

展开
收起
爱吃鱼的程序员 2020-06-01 14:44:10 965 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    fgets(buffer,100,stdin);
    len = strlen(buffer);
    buffer[len-1] = '\0';

    ######fgets() 会把行尾的 '\n' 也读入,也就是说你用 fgets(buffer,100,stdin) 读入的很可能是"/mnt/hgfs/sky/a.txt\n\0" , 你可以打印出字符串所有内容确认一下是否因为这个原因导致  open() 调用失败的。
    ######char buffer[101]={0};######@夜游神(Lunar) : 遇到此类问题,我总是愁于不知道怎么去查证。可否透露一下查证方法? 我写程序很小心,不确定的写法一定不会写,尽管已在多个平台下试验过。######@恋恋美食 : 昨天又遇到这个问题,然后查证了下.正确说法是:在GCC和VS系列上, 如果使用了{}初始化语法,那么没在这个{}里出现的元素将被初始化为0. 所以{0}的效果是,将第一个元素赋值为0,然后再额外的将剩下所有元素赋值为0(因为未出现). 这个是编译器自己主动做的,标准好像没提.VC和GCC下是正确的. done~ : )######@夜游神(Lunar) : 谢了,以后还是用memset好了。多写行代码免去不必要的纠结,还是值得的。######@恋恋美食 : 以前争议过, 这种方式初始化,理论上只有第一个元素被置为0,后面依旧是随机的. 但传说主流编译器遇到这种初始化方式会全部置为0,以体贴广大程序员. 传说而已,我未验证过. 如果需要,最好还是memset,毕竟理论安全第一. 但是我属于效率狂+初始化懒惰者,从来不爱初始化.######我想知道这种初始化方式是不是标准的? 一直没敢用过,还用用memset初始化。######

    试了一下,我查看了buffer最后一位是NULL,不行啊,还是谢谢楼上各位,期待大侠来解决

     

    ######

    谢谢最后一楼,解决了

    ######等我以后有了分数,就给最后一楼啊
    2020-06-01 14:44:21
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载