关于linux下open函数的问题

王一峰 发布于 2011/09/19 19:22
阅读 1K+
收藏 0

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

加载中
0
m
maxyma
fgets(buffer,100,stdin);
len = strlen(buffer);
buffer[len-1] = '\0';

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

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

 

0
王一峰

谢谢最后一楼,解决了

0
王一峰
等我以后有了分数,就给最后一楼啊
返回顶部
顶部