Chinaunix

标题: 向文件写入整数出错 [打印本页]

作者: disheng727    时间: 2008-09-15 21:42
标题: 向文件写入整数出错
在将一个整数写入文件时,运行结果没问题,但文件中的内容却不是写入的整数,看上去像乱码,不知为何?请高手指教。例如,我是这样写的:

  int  fd;  /* fd 指向的文件存在,且为空, 0 byte */
  int tick_number=0x12345678;
   rval=write( fd, &tick_number, sizeof(int ));  /*结果rval=4 */
   但fd指向的文件中的内容不是0x12345678;
   小弟已经试了好几次了,都不行。
作者: wangqi0021    时间: 2008-09-15 21:55
原帖由 disheng727 于 2008-9-15 21:42 发表
在将一个整数写入文件时,运行结果没问题,但文件中的内容却不是写入的整数,看上去像乱码,不知为何?请高手指教。例如,我是这样写的:

  int  fd;  /* fd 指向的文件存在,且为空, 0 byte */
  int tick ...


好好看看apue
回头你再用fwrite试一下,再看下结果

[ 本帖最后由 wangqi0021 于 2008-9-15 21:58 编辑 ]
作者: disheng727    时间: 2008-09-15 22:04
这是书上的示例,原如下:
  if ( ticket_number >= ticket_want ) {
        ticket_number-=ticket_want;
        lseek(fd, 0, SEEK_SET);
        if( write( fd, &ticket_number, sizeof(int)) < sizeof(int)) {
                          printf("write to ticket.txt error\n");
                          exit(1);
           }
       printf("there are %d ticket now \n",ticket_number );
} // end if
作者: happy_fish100    时间: 2008-09-15 22:14
标题: 回复 #1 disheng727 的帖子
int的字节数为4,write( fd, &ticket_number, sizeof(int)) 写入的是4字节。
你直接通过vi等查看文件内容,看到的肯定是乱码。
你采用二进制方式查看文件内容,看十六进制的表示就可以了(8个十六进制字符)。
作者: zszjxh    时间: 2008-09-15 22:15
当然不是0x12345678
显示的是ascii码为0x78、0x56、0x34、0x12的字符
作者: disheng727    时间: 2008-09-15 22:34
哦,原来需要用od 命令查看,od -tx1 filename

写入文件的是整形数据,查看为什么却看不到呢?不大明白。

3.GIF (2.17 KB, 下载次数: 99)

3.GIF

作者: 随风缘    时间: 2008-09-15 22:57
文件是以字符形式为单位的嘛,
写入文件的时候,你要看看是大端小端.
作者: wangqi0021    时间: 2008-09-15 23:01
原帖由 随风缘 于 2008-9-15 22:57 发表
文件是以字符形式为单位的嘛,
写入文件的时候,你要看看是大端小端.


你有点扯远了吧。
作者: wangqi0021    时间: 2008-09-15 23:02
原帖由 disheng727 于 2008-9-15 22:34 发表
哦,原来需要用od 命令查看,od -tx1 filename

写入文件的是整形数据,查看为什么却看不到呢?不大明白。


因为系统调用写入的是原始数据。

你再用标准库试一下 就知道区别了
作者: 随风缘    时间: 2008-09-15 23:02
原帖由 wangqi0021 于 2008-9-15 23:01 发表


你有点扯远了吧。



你扯个近的我看看.
作者: antonym55    时间: 2008-09-15 23:11
你用用的是小端的机器,所以低位在低字节的位置

最低两位数字是78, 显示16进制数时是一个字节一个字节显示的
作者: fera    时间: 2008-09-16 16:54
原帖由 随风缘 于 2008-9-15 22:57 发表
文件是以字符形式为单位的嘛,
写入文件的时候,你要看看是大端小端.


用od查看,再根據機器的大小端順序來讀,就知道寫的是0x12345678。你要是用文本查看器當然顯示亂碼。
用write沒錯,用fwrite也可以。

關鍵的問題是:你寫的是binary數據,而不是ascii數據。
要想用文本查看器查看時不顯示亂碼,先轉換成字符串。
作者: wangqi0021    时间: 2008-09-16 20:25
原帖由 随风缘 于 2008-9-15 23:02 发表



你扯个近的我看看.


人家说的是存贮进去之后看到的是二进制码。和大小端有毛关系 。
作者: fera    时间: 2008-09-17 11:29
原帖由 wangqi0021 于 2008-9-16 20:25 发表


人家说的是存贮进去之后看到的是二进制码。和大小端有毛关系 。

二進制碼的順序跟大小端有關。
作者: net_robber    时间: 2008-09-17 12:02
'123'和字符串"123"是不一样的
作者: wangqi0021    时间: 2008-09-17 13:08
原帖由 fera 于 2008-9-17 11:29 发表

二進制碼的順序跟大小端有關。


人家没说顺序 人家说的是 为什么是乱码  和大小端 有毛关系
作者: fera    时间: 2008-09-17 13:13
原帖由 wangqi0021 于 2008-9-17 13:08 发表


人家没说顺序 人家说的是 为什么是乱码  和大小端 有毛关系

我倒,引申一下而已。
作者: 随风缘    时间: 2008-09-17 13:28
原帖由 wangqi0021 于 2008-9-17 13:08 发表


人家没说顺序 人家说的是 为什么是乱码  和大小端 有毛关系


你的回答都是错误的. write, fwrite 都是一样的.
作者: 随风缘    时间: 2008-09-17 13:28
原帖由 wangqi0021 于 2008-9-17 13:08 发表


人家没说顺序 人家说的是 为什么是乱码  和大小端 有毛关系



建议你多看看书,补习一下操作系统,以及基础知识,这样的水平回答问题只能误导别人,
无论你工作与否都别这么浮躁.
作者: 随风缘    时间: 2008-09-17 13:29
原帖由 wangqi0021 于 2008-9-15 21:55 发表


好好看看apue
回头你再用fwrite试一下,再看下结果



既然回答问题,就使一下是否可行,草率的回答别人的问题,对你自己对别人都不好,
尤其像你这么浮躁.
作者: 随风缘    时间: 2008-09-17 13:34
原帖由 wangqi0021 于 2008-9-15 23:02 发表


因为系统调用写入的是原始数据。

你再用标准库试一下 就知道区别了


这种回答实在让人呕吐.
作者: fera    时间: 2008-09-17 14:07
原帖由 随风缘 于 2008-9-17 13:29 发表



既然回答问题,就使一下是否可行,草率的回答别人的问题,对你自己对别人都不好,
尤其像你这么浮躁.

偶在就說fwrite和write一樣,可沒人理啊。
作者: 随风缘    时间: 2008-09-17 14:15
原帖由 fera 于 2008-9-17 14:07 发表

偶在就說fwrite和write一樣,可沒人理啊。


大家都不指出那小子,也就是wangqixxx的错误,实际上对wangqixxx很不好,我们勇敢的指出来,而这小子却不听,呵呵.

他实在太浮躁了.不惜的搭理他吧.
作者: wangqi0021    时间: 2008-09-17 16:12
原帖由 随风缘 于 2008-9-17 14:15 发表


大家都不指出那小子,也就是wangqixxx的错误,实际上对wangqixxx很不好,我们勇敢的指出来,而这小子却不听,呵呵.

他实在太浮躁了.不惜的搭理他吧.

我的回答确实错了 我自己试验了一下。  不过请你这个不浮躁的人告诉我 乱码和大端小端有什么关系。
作者: 随风缘    时间: 2008-09-17 16:14
原帖由 wangqi0021 于 2008-9-17 16:12 发表

我的回答确实错了 我自己试验了一下。  不过请你这个不浮躁的人告诉我 乱码和大端小端有什么关系。



难道你没看出来楼主想问什么吗?是想问到底为什么乱码是关键,还是说要想写入0x12345678.

知道错了,就不要再狡辩,那样显的多么的无力.
作者: wangqi0021    时间: 2008-09-17 16:17
原帖由 随风缘 于 2008-9-17 16:14 发表



难道你没看出来楼主想问什么吗?是想问到底为什么乱码是关键,还是说要想写入0x12345678.

知道错了,就不要再狡辩,那样显的多么的无力.


想显摆一下 结果被别人戳穿了 。 呵呵 可笑 搞得词不达意
作者: 随风缘    时间: 2008-09-17 16:18
原帖由 wangqi0021 于 2008-9-17 16:12 发表

我的回答确实错了 我自己试验了一下。  不过请你这个不浮躁的人告诉我 乱码和大端小端有什么关系。



我不给你指出错误,不知道你还要错多久.
做技术别这么浮躁,别谁说都不听。
作者: 随风缘    时间: 2008-09-17 16:21
原帖由 wangqi0021 于 2008-9-15 23:02 发表


因为系统调用写入的是原始数据。

你再用标准库试一下 就知道区别了



不知道为什么,每次看到这个我都想吐.
作者: web-zw    时间: 2008-09-17 17:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: dts011    时间: 2008-09-17 22:56
同一台机器上怎么和大小端有关系?
作者: SST中国    时间: 2008-09-18 08:09
原帖由 web-zw 于 2008-9-17 17:16 发表
write 和 fwrite 不能够说一样,看看内核就知道他们之间的关系了。



你刚好说错了, write的实现是内核函数,而fwrite的实现是封装write,而并非内核的.

如果你想看看他们的关系,要看glibc. 所以你说"看看内核就知道他们的关系了." 是很没道理的.

他并没有说write和fwrite一样.他们的参数都不一样,泛泛的说一样是不负责的.具体的我建议你去看glibc.而不是内核.

[ 本帖最后由 SST中国 于 2008-9-18 08:11 编辑 ]
作者: kmindg    时间: 2008-09-18 14:57
原帖由 dts011 于 2008-9-17 22:56 发表
同一台机器上怎么和大小端有关系?


我也这么觉得 反对者来讨论下吧
作者: 随风缘    时间: 2008-09-18 15:04
原帖由 kmindg 于 2008-9-18 14:57 发表


我也这么觉得 反对者来讨论下吧


如果你想向文件的前4个字节写入0x12,0x34,0x56,0x78 ,并且只让你用个int类型的变量写入,(不考虑char类型.) 你不考虑大端小端吗? 真是懒的向你这样的人解释.
作者: brtjiba    时间: 2008-09-18 16:17
哎,我来揣测一下楼主的意思应该是可以通过sprintf以后write吧
作者: jetvster    时间: 2008-09-19 12:21
这个应该是编码的问题,你向文件中写入的是流数据,也就是是原始数据.

在搞JAVA的时候有这样的问题,C++不怎么了解,供参考!
作者: ynchnluiti    时间: 2008-09-19 12:41
原帖由 随风缘 于 2008-9-18 15:04 发表


如果你想向文件的前4个字节写入0x12,0x34,0x56,0x78 ,并且只让你用个int类型的变量写入,(不考虑char类型.) 你不考虑大端小端吗? 真是懒的向你这样的人解释.

支持。楼主就是想看到0x12345678。因为没看到所以以为文件写错了。
作者: SST中国    时间: 2008-09-19 14:36
原帖由 jetvster 于 2008-9-19 12:21 发表
这个应该是编码的问题,你向文件中写入的是流数据,也就是是原始数据.

在搞JAVA的时候有这样的问题,C++不怎么了解,供参考!




作者: lanying_wzw    时间: 2008-09-19 19:56
chinaunix的人水平也就这样了
作者: xi2008wang    时间: 2008-09-19 20:51
LZ需要的是向文件里写字符, 而不是数字
作者: dingweiqi    时间: 2008-09-19 21:58
提示: 作者被禁止或删除 内容自动屏蔽
作者: pingtunao89    时间: 2008-09-20 06:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: pingtunao89    时间: 2008-09-20 07:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: pingtunao89    时间: 2008-09-20 07:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: pingtunao89    时间: 2008-09-20 08:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: pingtunao89    时间: 2008-09-20 08:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: xishagu39    时间: 2008-09-20 10:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: xishagu39    时间: 2008-09-20 10:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: xishagu39    时间: 2008-09-20 16:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: tanzhuomei71    时间: 2008-09-20 18:15
标题: 回复 #1 disheng727 的帖子
已经试了好几次了,都不行。
作者: fera    时间: 2008-09-22 11:28
原帖由 SST中国 于 2008-9-18 08:09 发表



你刚好说错了, write的实现是内核函数,而fwrite的实现是封装write,而并非内核的.

如果你想看看他们的关系,要看glibc. 所以你说"看看内核就知道他们的关系了." 是很没道理的.

他并没有说write和fwri ...

兄弟,咱說得簡短了。應該是write和fwrite寫入數據的結果是一樣的。
作者: fera    时间: 2008-09-22 11:29
那您還是去別的地兒吧,咱們這容不下你這條龍。
原帖由 lanying_wzw 于 2008-9-19 19:56 发表
chinaunix的人水平也就这样了

作者: spiritX    时间: 2008-09-22 11:31
汗, 用编辑器打开直接看的都是字符串呀, 你这是整型数, 当然是乱码了
作者: yixineryi    时间: 2008-09-24 13:02
标题: 呵呵
有些时候,有些问题不能太认真了。
作者: liyaoshi    时间: 2008-09-24 23:23
hexdump
hexedit
作者: wstar    时间: 2008-10-06 11:21
大家讨论的很热闹啊。
作者: 312-pirl0    时间: 2008-10-21 18:13
3楼正解,你如果把它翻译成char后,再写入文件就可以知道了。
作者: redor    时间: 2008-10-21 18:31
原帖由 disheng727 于 2008-9-15 21:42 发表
在将一个整数写入文件时,运行结果没问题,但文件中的内容却不是写入的整数,看上去像乱码,不知为何?请高手指教。例如,我是这样写的:

  int  fd;  /* fd 指向的文件存在,且为空, 0 byte */
  int tick ...


hexdump file 看看
作者: samon_fu    时间: 2008-10-21 19:10
标题: 回复 #1 disheng727 的帖子
大头小头在不同的linux系统下差别不大的。

按小平同志头像的兄弟建议的,请用fwrite试试。好像参数还有个b的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2