想优化一下这个程序

lidexin2003 2011-06-12 01:13:33
最近遇到一个问题,描述如下:
将指定文件中的所有小写字母都转换大写字母,要求的命令格式为:
change filename


我的解决方案:
1. 把原文件的内容复制到另一个文件中,且同时进行转换。
2. 然后再用转换后的文件内容,覆盖原文件。

=====================算法开始;我用的VS2008写的=================================
#include <iostream>
using namespace std;

int main(int argc , char * argv[])
{
FILE * in , * out;
char ch;

if(argc != 2) //检查参数够不够
{
printf("You forgot to enter a filename\n");
exit(0);
}

if( (in = fopen(argv[1],"r+") ) == NULL) //检查要改变大小写字母的文件是否能被打开。
{
printf("can not open infile\n");
exit(0);
}

if((out = fopen("tempfile.txt" , "w+")) == NULL) //建立一个临时文件,用于转换
{
printf("temp file can not be created, can not change.\n");
exit(0);
}


while(!feof(in)) //开始复制
{
ch = fgetc(in);
if(ch >= 97 && ch <= 129) //如果是小写字母就进行转换
ch = ch - 32;
fputc(ch , out);
}

rewind(in); //重新定位到文件头
rewind(out); //重新定位到文件头

while(!feof(out)) fputc(fgetc(out), in); //用转换好的文件内容覆盖原文件

fclose(in);
fclose(out);
}
=====================算法结束=================================

我的问题:
1. 我的这个程序时间和空间的效率都太低,各位能帮我看看,还能怎么在优化一下?
2. 我原想用fseek()函数,即如果读入内存的字符是小写字母就进行转换,且立即覆盖原小写字母,但我这样做是后,就它陷入了死循环.
...全文
96 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lidexin2003 2011-06-16
  • 打赏
  • 举报
回复
谢谢啊,这个ftell函数还没用过,我试试~[Quote=引用 2 楼 sduxiaoxiang 的回复:]
ftell得到文件大小size
char* buffer大小size
fread读取size大小,即全部
替换
写回去
[/Quote]
lidexin2003 2011-06-16
  • 打赏
  • 举报
回复
为什么用fseek会出问题?[Quote=引用 1 楼 dizuo 的回复:]
全部读取到数组中,操作完写回去。
fseek定位修改会出问题。
[/Quote]
lidexin2003 2011-06-16
  • 打赏
  • 举报
回复
如果我们事先无法得知文件大小呢?[Quote=引用 1 楼 dizuo 的回复:]
全部读取到数组中,操作完写回去。
fseek定位修改会出问题。
[/Quote]
wangsifu2009 2011-06-12
  • 打赏
  • 举报
回复
楼主使用fseek出现了一点问题,3楼那样是正确的。边读边写
wangsifu2009 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kid_coder 的回复:]
C/C++ code

#include <iostream>
using namespace std;

int main(int argc , char * argv[])
{
FILE * in ;

if(argc != 2) //检查参数够不够
{
printf("You forgot to enter a fi……
[/Quote]
比较好
kerphy 2011-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
全部读取到数组中,操作完写回去。
fseek定位修改会出问题。
[/Quote]
为啥不能把出问题的原因找出来,然后解决呢?

不管是在新文件中改写再覆盖源文件还是全部读入内存都是低效率的做法。
KID_coder 2011-06-12
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

int main(int argc , char * argv[])
{
FILE * in ;

if(argc != 2) //检查参数够不够
{
printf("You forgot to enter a filename\n");
exit(0);
}

if( (in = fopen(argv[1],"r+") ) == NULL) //检查要改变大小写字母的文件是否能被打开。
{
printf("can not open infile\n");
exit(0);
}

char str[1024];
while ( fgets(str, 1024, in) ) //按行获取
{
int len = strlen(str);
for ( int i=0; i<len; ++i ) //转换
{
if ( str[i] >= 97 && str[i] <= 129 )
str[i] = str[i] - 32;
}
fseek(in, -(len+1), SEEK_CUR);
fputs(str, in);
fseek(in, len+1, SEEK_CUR);
}
fclose(in);
return 0;
}

sduxiaoxiang 2011-06-12
  • 打赏
  • 举报
回复
ftell得到文件大小size
char* buffer大小size
fread读取size大小,即全部
替换
写回去
ryfdizuo 2011-06-12
  • 打赏
  • 举报
回复
全部读取到数组中,操作完写回去。
fseek定位修改会出问题。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧