+ -
当前位置:首页 → 问答吧 → 把结构体内容保存到文件中,乱码了

把结构体内容保存到文件中,乱码了

时间:2010-07-20

来源:互联网

本帖最后由 ChiyuT 于 2010-07-20 10:11 编辑

就是一段很简单的代码,把结构体 first 的内容通过文件 temp 复制到 second,可是复制之后发现是乱码,好像根本就没有复制成功,不太明白是怎么回事,有劳诸位指点一下。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <strings.h>

  4. typedef struct node {
  5.         int x;
  6.         double y;
  7.         char ch;
  8. } Node;

  9. int main(void)
  10. {

  11.         Node first;
  12.         Node second;
  13.         FILE * in;

  14.         first.x = 10;
  15.         first.y = 0.1;
  16.         first.ch = 'a';

  17.         if ((in = fopen("temp", "rw")) == NULL) {
  18.                 perror("Memory allocate!\n");
  19.                 exit(EXIT_FAILURE);
  20.         }
  21.         fwrite(&first, sizeof(Node), 1, in);
  22.         fread(&second, sizeof(Node), 1, in);
  23.         printf("%d %f %c\n", second.x, second.y, second.ch);

  24.         fclose(in);

  25.         return 0;
  26. }
复制代码

作者: ChiyuT   发布时间: 2010-07-20

本来就是乱码喔

作者: duanjigang   发布时间: 2010-07-20

fopen最好指定二进制模式  用“w+b”

fread前要fseek到文件头

作者: hellioncu   发布时间: 2010-07-20



QUOTE:
本来就是乱码喔
duanjigang 发表于 2010-07-20 10:13




不明白了 难道不能将一整个结构体保存入一个文件,然后再进行读取吗? 为什么这样会乱码呢?

作者: ChiyuT   发布时间: 2010-07-20

本帖最后由 duanjigang 于 2010-07-20 10:33 编辑


QUOTE:
不明白了  难道不能将一整个结构体保存入一个文件,然后再进行读取吗? 为什么这样会乱码呢? ...
ChiyuT 发表于 2010-07-20 10:27




    可以啊,写入,读取都可以,但是写入二进制的显示出来本来就是乱码。
你只是把内存中的数据拷贝出来写入文件,编辑器又不会给你智能提取结构体的成员并显示,呵呵

作者: duanjigang   发布时间: 2010-07-20



QUOTE:
fopen最好指定二进制模式  用“w+b”

fread前要fseek到文件头
hellioncu 发表于 2010-07-20 10:15




多谢指教! fseek是我不小心忽略了,惭愧。

刚才改为“w+b”模式果然就不乱码了。  我记得linux不是只有一种文件类型吗,那么是否带字母b应该是没有影响的吧,谁知道居然出错……奇怪

作者: ChiyuT   发布时间: 2010-07-20



QUOTE:
多谢指教! fseek是我不小心忽略了,惭愧。

刚才改为“w+b”模式果然就不乱码了。:mrgree ...
ChiyuT 发表于 2010-07-20 10:34




    关键是没有“rw”这种模式

作者: hellioncu   发布时间: 2010-07-20



QUOTE:
可以啊,写入,读取都可以,但是写入二进制的显示出来本来就是乱码。
你只是把内存中的数据拷贝 ...
duanjigang 发表于 2010-07-20 10:31




   
惭愧,一直以为linux下是否带b是没有影响的……  谢谢指教。

作者: ChiyuT   发布时间: 2010-07-20



QUOTE:
关键是没有“rw”这种模式
hellioncu 发表于 2010-07-20 10:36




    谢谢,这个太丢人了。。。。重新再翻翻书,记得有“rb”这种,一下子就有点混了。

作者: ChiyuT   发布时间: 2010-07-20



QUOTE:
惭愧,一直以为linux下是否带b是没有影响的……  谢谢指教。
ChiyuT 发表于 2010-07-20 10:37




    你这里不是b的问题,是“rw”的问题,用“w+”同样应该可以

作者: hellioncu   发布时间: 2010-07-20



QUOTE:
你这里不是b的问题,是“rw”的问题,用“w+”同样应该可以
hellioncu 发表于 2010-07-20 10:40




   是的,刚才已经试过了,确实是模式弄错了。 谢谢。

作者: ChiyuT   发布时间: 2010-07-20



QUOTE:
惭愧,一直以为linux下是否带b是没有影响的……  谢谢指教。
ChiyuT 发表于 2010-07-20 10:37




    我错误理解你的问题了,呵呵
一般不是一行一行读的,我都直接用系统io, open read 和write,二进制方便。

作者: duanjigang   发布时间: 2010-07-20