| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1175 人关注过本帖
标题:文件转换的问题
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
如果你是问 read write 的那个代码。那它只是读文件打印在屏幕上,和读屏幕写回文件,并没有同时读一个文件写另一个文件。
而且就算是读一个文件写另一个文件,本质上和往屏幕上写也没什么区别。想把一个字符串写到文件里用 fprintf 就行,想从文件里读7个字符,用循环加 fscanf 就可以。当然愿意用 fread 和 fwrite 也行。


[ 本帖最后由 pangding 于 2012-2-23 22:54 编辑 ]
2012-02-23 22:42
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 11楼 pangding
void transe_abc()
{
  FILE *fp =fopen("abc.txt", "rb");
  int c;
  char b[2048];   
  int k;
  int i = 7;
  int j = 0;
  fread(&c, 1, sizeof(char), fp);
  while(!ferror(fp) && !feof(fp)){
      k = 7;
      while(k-- >0){
       if(c >> k & 0x00000001){
            b[j++] = '1';
       }
       else{
           b[j++] = '0';
       }
       b[j++] = ' ';
       if(--i == 0){
         b[j++] = 0;
         printf("%s",b);
         j = 0;
         i = 7;
       }
      }

      fread(&c, 1 ,sizeof(char), fp);      
  }
  fclose(fp);

  if(i){
      while(i--){
        printf("   ");
      }
       b[j] = 0;
       printf("%s\n",b);
  }
}

像这个我读了文件里7个字符..如何再写回进去.. FILE *fp =fopen("abc.txt", "rb");不能同时读写把..就这里不懂..求指导...
2012-02-27 08:57
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
你不是都读到 b 这个数组里了吗。然后别立刻 close 文件。用 fseek 把当前位置设置到文件开始,然后往里写。
写完之后,你得把文件截断到你写的地方。因为你写完的文件有可能比原来的短,写文件只是一种覆盖行为,后面没盖掉的其实还留着。

POSIX.1-2001 规定了 ftruncate() 用来截断文件长度,但它不是 C的标准库函数,不支持 POSIX 标准的编译器可能不提供。
据说微软也提供了一个叫 chsize() 的函数来完成类似的工作。你可以自己查查相关的资料。

印象里你说你才学了几天的 c。不用对这段代码太过执著。
除非你以前学过其它语言的话另作别论,不过一般入门的书都是最后讲文件操作。其实这么安排也有一定的道理,毕竟它涉及的东西比较多,而且学习它本身和学习语言本身不是很相关。
2012-02-28 00:50
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 13楼 pangding
void transe_abc()                              /*把abc.txt文件转换成abc.enc   把每个字符8个字节删减为只保留后面7个字节*/
{
  FILE *fip =fopen("abc.txt", "rb");
  FILE *fop =fopen("temp", "wb");
  int  e;
  char f = 0;
  int  g = 8;
  int c;
  char b[2048];
  char d[2048];
  int k;
  int i = 7;
  int j = 0;
  int l = 0;
  fread(&c, 1, sizeof(char), fip);
  while(!ferror(fip) && !feof(fip)){
      k = 7;
      while(k-- >0){
        if(c >> k & 0x00000001){
            b[j++] = '1';
            d[l++] = '1';
      }
      else{
        b[j++] = '0';
        d[l++] = '0';
       }
      b[j++] = ' ';
      if(--i == 0){
        b[j++] = 0;     
        j = 0;
        i = 7;
       }
      }
      fread(&c, 1 ,sizeof(char), fip);      
  }
  if(i){
      while(i--){
        printf("   ");
      }
       b[j] = 0;
  }
  printf("%s",d);
  for(e=0; e<strlen(d); e++){
       if (d[e] == '0'){
          f = f<<1;
          g--;
       }
       else if (d[e] == '1'){
          f = f<<1;
          f += 1;
          g--;
       }
       if (g == 0){
          fwrite(&f, 1, sizeof(f), fop);
          f = 0;
          g = 8;
       }
  }
  if (g != 8){
         while (g--){
             f = f << 1;
         }
         fwrite(&f, 1, sizeof(f), fop);
  }  
  fclose(fip);
  fclose(fop);
  system("del abc.txt");
  system("move temp abc.enc");
}


=_=好了.....我没学过别的语言.....终于搞掂了...txt转换enc    取后七个字符..加密...
现在问题又来了=_=解密.....enc变回txt  ~~我知道是在前面加个0.但不知道怎么表达。。。
2012-02-28 09:49
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 13楼 pangding
void transt_abc()                              /*把abc.enc文件转换成abc.txt*/
{  
  FILE *fip =fopen("abc.enc", "rb");
  FILE *fop =fopen("temp", "wb");
  int  e;
  char f = 0;
  int  g = 8;
  int c;
  char b[2048];
  char d[2048];
  int k;
  int i = 8;
  int j = 0;
  int l = 0;
  fread(&c, 1, sizeof(char), fip);
  while(!ferror(fip) && !feof(fip)){
      k = 8;
      while(k-- >0){
        if(c >> k & 0x00000001){
            b[j++] = '1';
            d[l++] = '1';
      }
      else{
        b[j++] = '0';
        d[l++] = '0';
       }
      b[j++] = ' ';
      if(--i == 0){
        b[j++] = 0;     
        j = 0;
        i = 8;
       }
      }
      fread(&c, 1 ,sizeof(char), fip);      
  }
  if(i){
      while(i--){
        printf("   ");
      }
       b[j] = 0;
  }
  printf("%s",d);
  for(e=0; e<strlen(d); e++){
        if (g== 8){
          f = f<<1;
          g--;
        }        
        if (d[e] == '0'){
          f = f<<1;
          g--;
        }
        else if (d[e] == '1'){
          f = f<<1;
          f += 1;
          g--;
        }
      if (g == 0){
          fwrite(&f, 1, sizeof(f), fop);
          f = 0;
          g = 8;
       }
  }
  if (g != 8){
         while (g--){
             f = f << 1;
         }
         fwrite(&f, 1, sizeof(f), fop);
  }  
  fclose(fip);
  fclose(fop);
  system("del abc.enc");
  system("move temp abc.txt");
}


解密也好了       不过现在例如文件里有aa一个字符2进制码为01100001 01100001加密后前面会变成11000011 11000010..然后再解密就变 01100001 01100001 00000000  后面会多出一个 00000000  要怎么把多出那个删除呢。。。
2012-02-28 11:05
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 13楼 pangding
  for(e=0; e<strlen(d); e++){
        if (g== 8){
          f = f<<1;
          g--;
        }        
        if (d[e] == '0'){
          f = f<<1;
          g--;
        }
        else if (d[e] == '1'){
          f = f<<1;
          f += 1;
          g--;
        }
      if (g == 0){
          fwrite(&f, 1, sizeof(f), fop);
          f = 0;
          g = 8;
       }
  }
  if (g != 8){
         while (g--){
             f = f << 1;
         }


好了..这个问题我也解决了``不用了..把最后面那个写入删除就OK了,,,,....
2012-02-28 11:15
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
嗯。好复杂的程序呀……
2012-02-28 13:31
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>

void c2b(FILE *fi, const char *fn)
{
    FILE *fo = fopen(fn, "w");
    if (!fo) { perror("c2b: fopen"); exit(-1); }

    char c, b[8];
    while ((c = fgetc(fi)) != EOF) {
        int i;
        for(i = 0; i < 7; i++)
            b[i] = '0' + ( (c >> (6-i)) & 1 );
        b[i] = '\0';
        fprintf(fo, "%s", b);
    }

    fclose(fo);
}

void b2c(FILE *fi, const char *fn)
{
    FILE *fo = fopen(fn, "w");
    if (!fo) { perror("b2c: fopen"); exit(-1); }

    char c, b[8];
    while (fread(b, sizeof(char), 7, fi) == 7) {
        int i;
        for (c = 0, i = 0; i < 7; i++)
            c = (c << 1) | (b[i] - '0');
        fprintf(fo, "%c", c);
    }

    fclose(fo);
}

int main()
{
    FILE *fp = fopen("abc.txt", "r");
    // if (!fp) ...

    // 把 fp 转成 0101 的形式写到 "abc.enc" 里去。
    c2b(fp, "abc.enc");
    // 上面那个函数不管删文件。如果你愿意,可以在 close 之后自己删。
    fclose(fp);

    return 0;
}
2012-02-28 14:21
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 18楼 pangding
。。。这就是老手与新手的区别。。。。弱弱的问句while(!ferror(fip) && !feof(fip))   这个其实是什么意思。。。我只是很模糊知道大概。。实际什么意思是靠猜的。。能告诉下么。。
2012-02-28 14:30
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
很容易百度到这些函数的用法。我写的那个比较朴素,没有对IO做任何检查。
2012-02-28 15:33
快速回复:文件转换的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026770 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved