Chinaunix

标题: 请教一个简单C的文件程序 [打印本页]

作者: dacaisha    时间: 2010-12-23 10:47
标题: 请教一个简单C的文件程序
本帖最后由 dacaisha 于 2010-12-23 15:08 编辑

我在linux下写了一下代码,有几点不明白,还望各位高手指点:
fp指向的源文件为:
0 0 9 0 0 0 0
0 0 0 0 9 4 6
0 2 3 4 5 6 7
3 4 5 6 9 0 8
3 4 5 6 2 0 2

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
        short int num[5][7];
        FILE *fp,*fa;
        int byte=0;
        short int (*p)[7];
        p=num;

        
        if((fa=fopen(argv[2],"wb"))==NULL)
        {
                printf("Can not open file %s\n",argv[2]);
                exit(1);
        }
                                                                                                                             
        if((fp=fopen(argv[1],"rb"))==NULL)
        {
                printf("Can not open file %s\n",argv[1]);
                exit(1);
        }

        printf("%p %p\n",*p,num);      

        while(byte=fread(p,sizeof(short int,7,fp))
        {
             fwrite(p,sizeof(short int),byte,fa);         // 当我把程序中的short int都改成int时为什么每运行一步fwrite,都会写入两行呢,比如第一次运行时,目标文件中内容是

0 0 9 0 0 0 0
0 0 0 0 9 4 6  改成short int程序又正常呢?     



             printf("%d\n",**p);                                      // 这时候对p进行**p运算,为什么打印出来是一大串数字呢?而不是源文件二维数组中的某个元素呢?
          }

                  C语言新手,还望高手指点。。谢谢~!
作者: PCliangtao    时间: 2010-12-23 12:05
把fread 和 fwrite搞明白...
作者: dacaisha    时间: 2010-12-23 15:02
就是搞了两天没弄明白,才发帖问高手的。。。
作者: unicornSir    时间: 2010-12-23 17:19
对于16位机时sizeof(short int) = sizeof(int) = 2
对于32位机时sizeof(int) = 2 * sizeof(short int) = 2 * 2 = 4
明白了么?
作者: eossplendid    时间: 2010-12-23 17:23
char占一个字节,short int两个字节,int四个字节,一个short int刚好是一个数字加一个空格这两个字符的大小,你读了7个这样的大小刚好是一行,int是两倍,就是两行,好好看看man手册里对函数的解释吧
作者: dacaisha    时间: 2010-12-24 09:30
嗯,有点明白了。。谢谢!!!!那第二个问题,对p进行**p运算,为什么打印出来是一大串数字,而不是源文件二维数组中的某个元素呢?




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