找到一个程序还是我以前提的那个去掉注释的问题,高手来解释一下。

zhangyongnihao1 2009-06-17 12:46:51
帮忙解释一下该程序的每条语句。感激不尽
这个程序只能手写输出,怎么才能调用一个已存在的文件,并修改这个文件
还有就是它不能自己结束,是不是少东西啊?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(int argc,char * argv[]){
FILE * inputFile, * outputFile;
char c,c2;
inputFile = stdin;
outputFile = stdout;

for(int i = 1;i < argc;i++){//处理命令行参数
switch(argv[i][1]){
case 'i':
if(inputFile == stdin || inputFile == NULL){
printf("Input File :%s\n",argv[i] + 2);
inputFile = fopen(argv[i] + 2,"r");
}
break;
case 'o':
if(outputFile == stdout || outputFile == NULL){
printf("Output File :%s\n",argv[i] + 2);
outputFile = fopen(argv[i] + 2,"w");
}
break;
default:
fprintf(stderr,"不可识别的参数[%d] : %s\n",i,argv[i]);
break;
}
}

if(inputFile == NULL || outputFile == NULL){
fprintf(stderr,"指定的文件未找到\n");
exit(-1);
}

while(!feof(inputFile)){
c = fgetc(inputFile);
if(c == EOF)break;
if(c == '"'){//处理字符串
fputc(c,outputFile);
while(!feof(inputFile)){
c = fgetc(inputFile);
if(c == '\\'){
fputc(c,outputFile);
fputc(fgetc(inputFile),outputFile);
continue;
}
fputc(c,outputFile);
if(c == '"')break;
}
continue;
}
if(c == '/'){
c2 = fgetc(inputFile);
if(c2 == '/'){//“//”注释
for(c2 = fgetc(inputFile); c2 != '\n' && c2 != EOF;c2 = fgetc(inputFile));
}else if(c2 == '*'){//“/* */”注释
for(c2 = fgetc(inputFile); c2 != EOF;c2 = fgetc(inputFile)){
if(c2 == '*' && fgetc(inputFile) == '/')break;
}
}else{//非注释
fputc(c,outputFile);
fputc(c2,outputFile);
}
continue;
}
fputc(c,outputFile);
}

if(stdin != inputFile && inputFile != NULL)fclose(inputFile);
if(stdout != outputFile && outputFile != NULL)fclose(outputFile);
}
...全文
147 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyongnihao1 2009-06-21
  • 打赏
  • 举报
回复
谢谢你的帮忙,这个我大致是弄明白了
光宇广贞 2009-06-19
  • 打赏
  • 举报
回复
顶一个。
文刀劉Michael 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liao05050075 的回复:]
C/C++ code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(int argc,char * argv[]){
FILE * inputFile, * outputFile;//定义输入输出文件
char c,c2;
inputFile = stdin; //先把键盘输入作为文件输入
outputFile = stdout; //先把屏幕输出作为文件输出,也就是说,你运行程序是没有加参数,那么结果就是使用键盘和屏幕

for(int i = 1;i < argc;i++){//处理…
[/Quote]


高~
  • 打赏
  • 举报
回复
这个程序只能手写输出,怎么才能调用一个已存在的文件,并修改这个文件
还有就是它不能自己结束,是不是少东西啊?

inputFile 跟outputFile 不是你处理的文件吗?怎么不能调用已存在的文件?
liao05050075 2009-06-17
  • 打赏
  • 举报
回复
这个程序是文件输入的。只不过它的文件名和路径是通过运行程序时提供的参数来决定的。
比如你的程序编译之后生成abc.exe
然后你就运行cmd,在abc.exe所在目录输入 abc.exe c:\a.cpp C:\b.cpp
这样就把C:\a.cpp 的注释去掉,然后结果保存在c:\b.cpp中
liao05050075 2009-06-17
  • 打赏
  • 举报
回复

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

void main(int argc,char * argv[]){
FILE * inputFile, * outputFile;//定义输入输出文件
char c,c2;
inputFile = stdin; //先把键盘输入作为文件输入
outputFile = stdout; //先把屏幕输出作为文件输出,也就是说,你运行程序是没有加参数,那么结果就是使用键盘和屏幕

for(int i = 1;i < argc;i++){//处理命令行参数
switch(argv[i][1]){ //判断参数的类型
case 'i': //为输入文件名
if(inputFile == stdin || inputFile == NULL){
printf("Input File :%s\n",argv[i] + 2);
inputFile = fopen(argv[i] + 2,"r"); //设置文件输入
}
break;
case 'o': //为输出文件名
if(outputFile == stdout || outputFile == NULL){
printf("Output File :%s\n",argv[i] + 2);
outputFile = fopen(argv[i] + 2,"w"); //设置文件输出
}
break;
default:
fprintf(stderr,"不可识别的参数[%d] : %s\n",i,argv[i]);
break;
}
}

if(inputFile == NULL || outputFile == NULL){
fprintf(stderr,"指定的文件未找到\n");
exit(-1); //没有找到指定文件,程序直接结束
}

while(!feof(inputFile)){ //当还没有读到文件结束时
c = fgetc(inputFile); //读入一个字符
if(c == EOF)break; //读到文件结束,跳出循环
if(c == '"'){//处理字符串
fputc(c,outputFile);
while(!feof(inputFile)){
c = fgetc(inputFile);
if(c == '\\'){ //处理两个\的注释
fputc(c,outputFile);
fputc(fgetc(inputFile),outputFile);
continue;
}
fputc(c,outputFile);
if(c == '"')break;
}
continue;
}
if(c == '/'){ //处理/* */型的注释
c2 = fgetc(inputFile);
if(c2 == '/'){//“//”注释
for(c2 = fgetc(inputFile); c2 != '\n' && c2 != EOF;c2 = fgetc(inputFile));
}else if(c2 == '*'){//“/* */”注释
for(c2 = fgetc(inputFile); c2 != EOF;c2 = fgetc(inputFile)){
if(c2 == '*' && fgetc(inputFile) == '/')break;
}
}else{//非注释
fputc(c,outputFile);
fputc(c2,outputFile);
}
continue;
}
fputc(c,outputFile); //输出非注释的部分
}
//关闭文件
if(stdin != inputFile && inputFile != NULL)fclose(inputFile);
if(stdout != outputFile && outputFile != NULL)fclose(outputFile);
}

这里的命令行参数应该是用i、o来指定参数的类型
比如abc.exe i:a.cpp o:b.cpp 表示a.cpp为输入,b.cpp为输出

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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