搜索
查看: 1659|回复: 7
打印 上一主题 下一主题

求助:C语言文件进制转化保存

[复制链接]
跳转到指定楼层
楼主
发表于 2013-6-25 00:44:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
题目是利用函数void showFile(char * filename, char *arr, int h, int w)读取txt文件,其中参数fileName的实参应为文件路径名,arr为二维数组首元素的地址,h为高,w为宽,(意思是保存在大小为h*w的二维数组)利用在main函数定义的二维数组存放数据。

我的#include<stdio.h>
#include<stdlib.h>
int main()
{
void showFile(char * filename, char *arr, int h, int w);
char arr[22][46];

char *p;
showFile("D:\\pet.txt",*arr,22,46);
for(p=*arr;p<*(arr+1012);p++)
{
printf("%c",*p);
}
printf("\n");
return 0;
}

void showFile(char * filename, char *arr, int h, int w)
{
int i=1, j=0;
char c;
FILE *f;
if((f=fopen(filename,"r"))==NULL)
{
printf("can not open the file \n");
exit(0);
}

    while(!feof(f))
{
  c=fgetc(f);
  if(c=='\n'|| c==' ')
  {
   c=fgetc(f); i++;i++;
  }
  if(i%3==1)
  { *(arr+j)=(c-48)*16;i++;}
         else
  {
     if(c>='A'&&c<='E')
     {
      if(c=='A'&&c=='D')
      {*(arr+j)=0;}
      else
      {*(arr+j)=*(arr+j)+c-55;j++;}
     }
     else
     {
      *(arr+j)=*(arr+j)+c-48;
      j++;
     }
        i++;
   }
}
    fclose(f);
}     

基本思路是:删去文件中的换行,并将十六进制转为十进制,保存在数组里

编译没错,可是无法运行,不知道是存在什么问题,各位帮帮忙啊



然后这是文件的前面部分
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 0A
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 2F 7D 20 20 0D 0A
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 2F 20 7D 20 20 0D 0A

沙发
发表于 2013-6-25 01:24:04 | 只看该作者
这是用来做什么的?读取一个文本文件,存在一个数组里,然后再输出?
板凳
发表于 2013-6-25 02:22:03 | 只看该作者
本帖最后由 rosynirvana 于 2013-6-25 03:09 编辑

我能看出来的问题有
  1. for(p=*arr;p<*(arr+1012);p++)
复制代码
我大概知道你想用压扁数组的方法来输出,但是这里用错了
arr的类型是char *[46],换句话说+1就移动整整一行,+1012已经就大大越界了
正确的写法是
  1. for(p=*arr;p<&arr[21][46];p++)
复制代码
另外一般建议用下标访问一个数组,用Hanson的话来说就是,无论熟不熟悉C,下标的可读性永远比数组高。

后面的转化算法我没看明白,看到了一处
  1. if(c=='A'&&c=='D')
复制代码
估计是写错了

其实如果你只是要实现读取例子中那样排布的十六进制数,转化成十进制再输出,是个很简单的过程
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.     FILE *f;
  6.     int i;
  7.     char * filename = "d:/pet.txt";
  8.     if((f=fopen(filename,"r"))==NULL){
  9.         printf("can not open the file \n");
  10.         exit(0);
  11.     }

  12.     while(fscanf(f, "%x", &i) == 1)
  13.         printf("%d ", i);
  14.     return 0;
  15. }
复制代码
地板
 楼主| 发表于 2013-6-25 13:26:45 | 只看该作者
[b]题目的意思确实是读取一个文本文件,存在一个数组里,然后再输出。
遇到空格换行就换到下一个。
然后因为文件的元素有规律,就用(第一个字母*16+第二个字母)来转换为十进制。
但是要删去文本中的0A 0D(因为他们代表换行和回车),又因为AD只出现在第二个字母中,就判断第二个,然后遇到AD就使对应的a【i】【j】的值清零。
然后读完整篇txt,并回到主函数显示。

可是不知道为什么修改后还是无法运行??????
5#
 楼主| 发表于 2013-6-25 13:47:06 | 只看该作者
我的意思是
先判断txt中的换行和空格,如果是,再判断下一个;
由于文件有规律,我采用(第一个字母*16+第二个字母)转化为十进制;(ps:0-9  是char型,值为c-48;A-D,值为c-55;)
又因为文件中有0A  0D(代表换行和回车),判断第二个字母是不是AD,如果是,然后就对应的arr【i】【j】的值置零。


不知道哪里错了
6#
 楼主| 发表于 2013-6-25 13:48:28 | 只看该作者
rosynirvana 发表于 2013-6-25 02:22
我能看出来的问题有我大概知道你想用压扁数组的方法来输出,但是这里用错了
arr的类型是char *[46],换句话 ...

我的意思是
先判断txt中的换行和空格,如果是,再判断下一个;
由于文件有规律,我采用(第一个字母*16+第二个字母)转化为十进制;(ps:0-9  是char型,值为c-48;A-D,值为c-55;)
又因为文件中有0A  0D(代表换行和回车),判断第二个字母是不是AD,如果是,然后就对应的arr【i】【j】的值置零。

不知道为什么不能运行啊??
7#
发表于 2013-6-26 00:13:09 | 只看该作者
樱花自在 发表于 2013-6-25 13:48
我的意思是
先判断txt中的换行和空格,如果是,再判断下一个;
由于文件有规律,我采用(第一个字母*1 ...

你改过的代码再贴出来看看?

不过,为什么要一次读一个字符呢?这么有规律的数据,可以写一个简单的函数getdata,一次读取三个字符
但还是要转换成数字,还是太麻烦,有fscanf就用吧……
8#
发表于 2013-6-26 00:23:41 | 只看该作者
还有我觉得,能不能把原题贴出来?
我感觉这是把文件中的16进制转化成字符,或者说一个从bin映射到文本的问题……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表