| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 346 人关注过本帖
标题:T.P版在不··上次那个程序修改
只看楼主 加入收藏
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
T.P版在不··上次那个程序修改
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HELP 1
#define INDENT 2

FILE *fop;

int handleargs(int argc, char* argv[])
{
  if (argc != 2){
    return HELP;
  }
  if (argc == 2){
    return INDENT;
  }
}
void printindent(int indent)
{
  int i;
  for(i=0; i<indent; i++){
    fprintf(fop, " ");
  }
}

void printchar(char* line)
{
  int k =0;
  while(line[k++] == ' ')
    ;
  fputs(line+(k-1), fop);
  k = 0;
}

void printline(int indent, char* line)
{
  printindent(indent);
  printchar(line);
}

void doIdent(char* filename)
{
  int i = 0;
  int k = 0;
  char line[1000];
  int indent = 0;
  FILE *fip =fopen(filename, "r");
  fop = fopen("a.tmp", "w");
  fgets(line, 1000, fip);
  while (!ferror(fip)&&!feof(fip)){
  printf("%s",line);
    printf("%s", line);
    if(line[strlen(line)-2] == '}'){
      indent -=2;
      printline(indent, line);
    }
    else if(line[strlen(line)-2] == '{'){
      printline(indent, line);
      indent +=2;
    }
    else if(line[strlen(line)-1] == '}'){
      indent -=2;
      printline(indent, line);
    }
    else
      printline(indent,line);
    fgets(line, 1000, fip);
  }
  fclose(fip);
}

void help()
{
  printf("Useage:  a filename                      /* The document


indented */");
}

int main(int argc, char* argv[])
{
  switch(handleargs(argc,argv)){
  case INDENT:
    doIdent(argv[1]);
    fclose(fop);
    break;
  default:
    help();
  }
}

读最后一行肿么不行D。。。。..
还有替换你输入的文件后缀...
  filename[strlen(filename)-1]='c';
  filename[strlen(filename)-2]='n';
  filename[strlen(filename)-3]='e';

之前因为是txt转enc可以这样写。。。
但现在我要XX.c转XX.bak  然后写进XX.tmp···把XX.tmp替换成a.c   这个就弄不到了。。。.
2012-03-05 10:21
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
最后一行没\n。fgets读不了。..要怎么解决捏..T版上次给的程序没看懂.  

2012-03-05 11:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
你回头看我上次给你调试过的最后代码,注意看里面fgets()函数的位置,以及结束循环的方法,分析一下这部分跟你写的有什么不同,看过就明白为什么你这个读不到最后的'\n'了。

至于更改文件扩展名的问题,我有时间把上次给你的代码写上注释再让你看一看。

[ 本帖最后由 TonyDeng 于 2012-3-5 13:20 编辑 ]

授人以渔,不授人以鱼。
2012-03-05 13:18
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 3楼 TonyDeng
char argv[]
char command[1000]

ssprintf(command, "move %s %s.tmp", argv[1], prefix)
system(command)


刚头头教了这种方法..
2012-03-05 13:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那个也是用DOS操作的,跟你原先要求的不一样。move就是先copy后rename。而且这个方法的效果,取决于你赋给argv[1]的字符串到底是什么。

授人以渔,不授人以鱼。
2012-03-05 13:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我看你始终是没有弄明白自己的需求是什么,所以写程序总找不着思路。写程序之前一定要先理清自己想干什么!

你原先的初衷,是希望对任何一个文件名,比如"abcd.txt",把它改名为"abcd.enc"。关键问题是你并不知道那个文件名到底是怎样的,它可能是"abcd.txt",也可能是"abcd.c"、"abcd",甚至是"abcd.c.txt"、"abcd.c.html"。那么,到底它的扩展名是什么、有多少个字符都是不确定的。因此,你唯一的办法,只能作一个假定,“扩展名必定是最后一个句号.后面的那一串字符,如果没有扩展名,就自己补一个,如果有,就改掉它”。

操作的办法,就是从文件名的右边开始往回找"."字符,如果找到,就把这个位置后面的字符串全部砍掉,然后补上自己希望的扩展名。如果找不到,那么表明这个文件名是没有扩展名的,就直接在后面补上需要的扩展名。这样,就不用管最右边的"."字符之前是什么字符串,即保持文件名不变。你要通用的代码,就按这个思路做。

4楼的代码,关键是那个argv[1]的值是什么,按你原先的要求,比如要"xxx"改为"xxx.tmp",那么argv[1]必须是"xxx",而不能是"xxx.c",否则move后,就成了"xxx.c.tmp",你要这样的结果吗?


[ 本帖最后由 TonyDeng 于 2012-3-5 14:12 编辑 ]

授人以渔,不授人以鱼。
2012-03-05 14:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你原先那个课题的要求,其实是这样的:给出一个已存在的文件名,你打开它,把里面的代码整理好,输出到同名但不同扩展名的一个文件中。

因此,你的程序事先肯定不知道那个文件的名字到底是什么,它需要从命令行参数中获取(即argv[1]),为了能够打开argv[1]指定的文件,它必定是完整的文件名,不能是没有扩展名的,比如你必须在命令行中输入"abcd.c",而不能仅输入"abcd",如果是后者,你就必须在程序代码中硬编码假定输入的"abcd"后面加上".c",那是不可接受的。

在获取输入文件名"abcd.c"之后,为了输出,你必须马上运算得到输出文件名filename,比如"abcd.tmp",然后打开"abcd.c"读句柄fin,同时打开"abcd.tmp"写句柄fout,读一行写一行。完成并关闭文件之后,把文件"abcd.c"删除,用rename把"abcd.tmp"改回"abcd.c"。这里的两个文件名,都在argv[1]和输出文件名filename中记忆着,所以最后的代码才用4楼的那样:

程序代码:
char command[100];
sprintf(command, "rename %s %s", filename, argv[1]);     // 用move也可以,DOS会智能处理,如果前后目录没有变化,就仅仅作rename操作,否则它会执行copy和delete操作实现物理移动
system(command);

在现实中,这种使用临时文件和创建临时名的操作,都要考虑覆盖同名文件的问题,那样你要想的就多了。不过那是以后的事,你还没到那一步。

[ 本帖最后由 TonyDeng 于 2012-3-5 14:39 编辑 ]

授人以渔,不授人以鱼。
2012-03-05 14:31
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 7楼 TonyDeng
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HELP 1
#define INDENT 2

FILE *fop;
FILE *fip;

int handleargs(int argc, char* argv[])
{
  if (argc != 2){
    return HELP;
  }
  if (argc == 2){
    return INDENT;
  }
}
void printindent(int indent)
{
  int i;
  for(i=0; i<indent; i++){
    fprintf(fop, " ");
  }
}

void printchar(char* line)
{
  int k =0;
  while(line[k++] == ' ')
    ;
  fputs(line+(k-1), fop);
  k = 0;
}

void printline(int indent, char* line)
{
  printindent(indent);
  printchar(line);
}

void doIdent(char* filename)
{
  char argv[1];
  int i = 0;
  int k = 0;
  int j = 0;
  char line[1000];
  int indent = 0;
  fip =fopen(filename, "r");
  filename[strlen(filename)-2] = '\0';
  while (!ferror(fip)&&!feof(fip)){
    if(fgets(line, 1000, fip) == NULL){
      break;
    }
    if(line[strlen(line)-2] == '}'){
      indent -=2;
      printline(indent, line);
    }
    else if(line[strlen(line)-2] == '{'){
      printline(indent, line);
      indent +=2;
    }
    else if(line[strlen(line)-1] == '}'){
      indent -=2;
      printline(indent, line);
    }
    else
      printline(indent,line);
  }
  fclose(fip);
}

void help()
{
  printf("Useage:  a filename                      /* The document indented */");
}

int main(int argc, char* argv[])
{
  char gogo[1000];
  char command[1000];
  switch(handleargs(argc,argv)){
  case INDENT:
    fop = fopen("a.tmp", "w");
    doIdent(argv[1]);
    fclose(fop);
    sprintf(command, "move %s.c %s.bak",argv[1],argv[1]);
    system(command);
    sprintf(gogo, "move a.tmp %s.c",argv[1]);
    system(gogo);
    break;
  default:
    help();
  }
}


完成了终于
2012-03-06 12:44
快速回复:T.P版在不··上次那个程序修改
数据加载中...
 
   



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

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