Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682837
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: C/C++

2010-09-28 15:56:05

Andrew Huang
 
这是课堂必出的练习,主要强化学生的不同类型文本的概念。以及对文件的操作。
 
基本概念:
 Unix 文本文件:
    换行符为\n, 最后一行只有一个回车符的空行
  Windows 文本文件:
    换行符为\r\n, 即有两个字符一起作为换行符.
  用工具可以互相转换
     Linux  上的工具创建文本文件都是Unix 文本文件. 在Windows 下直接用写字板打开, 回车没有生效
     有dos2unix和unix2dos这样开源小工具.
     Windows下的UltraEdit两种格式能识别

关于标准C 库的对文本的转换
 
Windows的情况:
 在Windows 下用文本文件模式打, 用fgets/fread 去读取文本文件, 在读取的数据中会自动把后面\r\n 的回车符换成\n
     FILE * fp=fopen(name,"rb"); // 以文本本件打开
  fgets(name,fp); 读到数据会以'\n'即0x0a 为回车符, 原有的0x0D 被自动截取
    读出总数据量也是( 文件总尺寸-'\r' 总数)
 在某一些情况下要完整读取全部数据, 如做Unix 文本和Windows 文本转换, 需要采用二进制模式. 才能读取
 
Linux下则比较简单,每次都是取出来'\n' 
    FILE * fp=fopen(name,?±rb?±); // 以二进制文件打开
 
要求
 
 

l      请写一个简单命令行工具,用于Windows文本文件和Unix 文件文件互相转换

     请用UltraEdit来验证是否转换成功

     要求由命令行参数来输入文件名.格式如下

l   textconv w|u source [destion]

l   textconv 是工具名称,第一个参数表示作何种转换,w表示把Unix文本文件转换为 Windows文本,u表示把Windows文件转换Unix文件,source是表示需要转换文本文件名,destion 表示转换后的文件文件,如果省略,表示直接覆盖原来的文本文件.

     应该有一定容错性,即本来是一个Unix文本文件,又转成Unix文本文件,应该自动误别.

     注意这个要用二进制文件打开,才能完整读出全部的数据

 

 

 

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


void usage()
{
    fprintf(stderr,"textconv w|u dst_file src_file\n");
}

int convert_unix2win(char * dst_file,char * src_file)
{
  FILE * dst=NULL,* src=NULL;
  int prev =EOF,cur;
  
  if((src = fopen(src_file,"rb")) == NULL)
  {
     fprintf(stderr,"open source file %s failure \n",src_file);
     exit(-3);
  }

  if((dst = fopen(dst_file,"wb+")) == NULL)
  {
     fclose(src);
     fprintf(stderr,"create destion file %s failure \n",dst_file);
     exit(-4);
  }

  while((cur =fgetc(src))!=EOF)
  {
            if(cur =='\n')
         {
             if(prev != '\r')    
         fputc('\r',dst);
        
         fputc('\n',dst);
         }
            else    
             fputc(cur,dst);

    prev = cur;
  }


   fclose(src);
   
    if(fclose(dst) == 0)
   {
     fprintf(stdout,"convert %s to %s as Windows Text file.",src_file,dst_file);
   }

   return 0;
}

int convert_win2unix(char * dst_file,char * src_file)
{
     FILE * dst=NULL,* src=NULL;
  int prev1 =EOF,cur,prev2= EOF;
  
  if((src = fopen(src_file,"rb")) == NULL)
  {
     fprintf(stderr,"open source file %s failure \n",src_file);
     exit(-3);
  }

  if((dst = fopen(dst_file,"wb+")) == NULL)
  {
     fclose(src);
     fprintf(stderr,"create destion file %s failure \n",dst_file);
     exit(-4);
  }

  while((cur =fgetc(src))!=EOF)
  {
    if(cur !='\r')
    {    
     fputc(cur,dst);

        prev2 = prev1;
        prev1 = cur;
    }
    
  }
  
    if((prev1!='\n') ||(prev2!='\n'))
     {
         //输入一个空行

         if(prev1!='\n')
     fputc('\n',dst);

       fputc('\n',dst);
     }
   
//使用fseek后,将无法写入




   fclose(src);
   if(fclose(dst) == 0)
   {
     fprintf(stdout,"convert %s to %s as Unix Text file.",src_file,dst_file);
   }

   return 0;
}

int conver_file(char * dst_file,char * src_file,char flag)
{
    switch(flag)
    {
    case 'w':
        return convert_unix2win(dst_file,src_file);
        break;
    case 'u':
        return convert_win2unix(dst_file,src_file);
        break;
    }

    return -2;
}


int main(int argc,char * argv[])
{
  char src_file[512];
  char dst_file[512];
  char flag;

  if(argc<4)
  {
     usage();
      exit(-1);
  }
  else
  {
    flag = argv[1][0];
    strncpy(src_file,argv[2],sizeof(src_file)-1);
  // if(argc == 3)

  // strcpy(dst_file,src_file);

  //    else

     strncpy(dst_file,argv[3],sizeof(src_file)-1);


  }

  exit(conver_file(dst_file,src_file,flag));
}


阅读(2137) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~