免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1491 | 回复: 6
打印 上一主题 下一主题

linux 文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-30 17:24 |只看该作者 |倒序浏览
这是源程序
#include <stdlib.h>
  2 #include <string.h>
  3 #include <stdio.h>
  4
  5 int onerror(int in, char *str);
  6 int main() {
  7     int i=0;
  8     int  buf[4096];
  9     for (i; i < sizeof(buf)/sizeof(int); i++) {
10         buf = i;
11 //      printf("%d\t", buf);
12     }
13     FILE * fileout;
14     fileout = fopen("digest.test", "w");
15     int result = fwrite(buf, sizeof(int),sizeof(buf)/sizeof(int), fileout);
16     onerror(result, "fwrite");
17     fclose(fileout);
18
19     return 0;
20
21 }
22
23 int onerror(int in, char * str) {
         if(in == -1 || in == 0){
25         printf("%s is error\n", str);
26         exit(1);
27     }
28     return 0;
29 }
可是打开文件却不是我想要的1-4095 的数字,是一群乱码,请问linux文件是以什么形式存储的?网上说linux没有字符型文件和二进制文件的区别,而是当作流,请问这是怎么回事?如果我想得到我想要的结果,应该怎么改亚? 谢谢

论坛徽章:
0
2 [报告]
发表于 2009-05-30 21:14 |只看该作者
百度了一下,某人说的,应该是对的。
就是因为,fwrite写的时候是按照二进制流处理的,
而你的单个的数字是int,实际占据了4个字节,而不是单个的char所占用一个字节,
所以,写入的时候,是int的数字,但是你所看到的输出,是按照单个字符所显示,肯定就是乱码了。

具体想要数字字符输出,下面代码已通过测试,可以用fprintf:

#include <string.h>
#include <stdio.h>

int main() {
    int i=0;
    int buf[4096];
    FILE * fout;
    int result;
   
    fout = fopen("digest.test", "w");
   
    for (i; i < sizeof(buf)/sizeof(int); i++) {
        buf[i] = i;
     //printf("%d\t", i);
     fprintf(fout, "%d\t", buf[i]);
    }

    fclose(fout);
   
    return 0;
}


另外,如果用sprintf也可以,可以参考:
http://zhidao.baidu.com/question/9665668.html

[ 本帖最后由 crifan 于 2009-5-30 22:00 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-05-30 22:03 |只看该作者
基本同楼上. 不过第10行的另外一个写法是 BUF[I]=I; LS打错字了吧?
另外,第15行.FWRITE的第三个参数应该是 sizeof(buf)*sizeof(int) 吧?
其实自己用GDB调式下就知道哪里错了.
LINUX文件也可以说是支持二进制和文本格式. 而且你用C函数的话,和操作系统本身都没啥关系. C函数库帮你搞定了操作系统的调用了.

论坛徽章:
0
4 [报告]
发表于 2009-05-30 22:26 |只看该作者
回3楼,“BUF[I]=I; LS打错字了吧?”
我开始也以为是呢,结果回复后正确的,发现也是显示出错,
bbs自动去掉你的两个中括号和中间的小写的I,呵呵。

另外,fwrite的函数原型是:
“fwrite(buffer,size,count,fp);
  (1)buffer:是一个指针,对fwrite来说,是要输出数据的地址。
  (2)size:要写入的字节数;
  (3)count:要进行写入size字节的数据项的个数;
  (4)fp:目标文件指针。”
LZ的用法,我觉得是对的。

论坛徽章:
0
5 [报告]
发表于 2009-05-31 08:51 |只看该作者
谢谢大家,原来fprintf 还能这么用, 我以前都是fprintf(stderr, .....);这么用的。
学习了,另外在linux中是不是文件都是作为二进制流处理的 ?

论坛徽章:
0
6 [报告]
发表于 2009-05-31 09:30 |只看该作者
还有一个问题, 例如 我写入一个int 类型的数 1024,如果按二进制流写入的是 0x01 0x00,用格式化输入,
它是怎么做到的显示出的数字是 1024的? 是把 1024 分成四个字符 '1' '2' '3' '4' 这样吗?那我读的时候怎么读

[ 本帖最后由 jazeltq 于 2009-5-31 13:57 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-05-31 22:40 |只看该作者
LINUX下也有文本格式的文件, 那些README之类的就是.
可以把1024转换成字符串后,再写到文件里. 可以用ITOA函数把整数转换成字符串.
读的时候也是读入一个字符串. 可以用FREAD, GETS? 来读入.

其实文件格式是很灵活的,如果是你自己的程序写文件,然后再读.想用2进制或者字符串格式随便你选. 如果你写一个文件,要用其他程序读.那么就要看那个读的程序支持什么样的格式.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP