题目:删除文件中的注释:将C语言程序test.c中的注释删除后存入另一个文件new_test.c中;

时间:2021-11-19 02:00:09
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
char s1[99];
int n, i, j, count;
FILE *fp1, *fp2;
if( (fp1 = fopen( "test.c", "r" )) == NULL )
{
printf("File open error!\n");
exit(0);
}
if( (fp2 = fopen( "new_test.c", "w" )) == NULL )
{
printf("File open error!\n");
exit(0);
}
while( !feof(fp1) )
{
count = 1;
fgets(s1, 99, fp1);
n = strlen(s1);
for( i = 0; i < n; i++ )
{
if( s1[i] == '/' && s1[i-1] == '/' )
{
s1[i-1] = '\n';
s1[i] = '\0';
fputs( s1, fp2 );
count = 0;
break;
}
if( s1[i] == '*' && s1[i-1] == '/' )
{
s1[i-1] = '\n';
s1[i] = '\0';
fputs( s1, fp2 );
count = 0;
break;
}
if( s1[i] == '/' && s1[i-1] == '*' )
{
for( j = 0; j < n-i; j++ )
s1[j] = s1[ j + i + 1];
s1[j] = '\0';
fputs( s1, fp2 );
count = 0;
break;
}
}
if(count)
fputs(s1, fp2);
}
if(fclose(fp1))
{
printf( "Can not close the file!\n" );
exit(0);
}if(fclose(fp2))
{
printf( "Can not close the file!\n" );
exit(0);
}
return 0;
}

输出结果最后多一个   }

4 个解决方案

#1


for( i = 0; i < n; i++ ) i应该是从1开始,要不然s1[i-1]可能越界

还有诸如下面的形式,你的成员能正常跑出结果吗?

print("sdads//fdfmd");

int a/*, b*/, c;

/*
Function: func
Parameter: x
*/

#2


最后读到文件尾,会先写入,再判断循环条件是否成立。i=0时,i-1越界吧

#3


引用 2 楼 kugeniha 的回复:
最后读到文件尾,会先写入,再判断循环条件是否成立。i=0时,i-1越界吧

那该怎么修改判断语句呢,我试了下用fscanf和fgets != EOF 不能解决问题

#4


最后再一个人的博客上看到了解释和解决方法
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。
对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。
而我们经常这样把它使用在循环中:
int c;
while(!feof(fp))
{
c = fgetc(fp);
printf("%x\n",c);
}
它是先判断==>再读(可能这时就是文件尾了, 读不出东西了)
所以正确的代码应该是
int c;

c = fgetc(fp);
while(!feof(fp))
{
printf("%x\n",c);
c = fgetc(fp); 
}
原博地址:
http://blog.sina.com.cn/s/blog_a3e571160101irii.html

#1


for( i = 0; i < n; i++ ) i应该是从1开始,要不然s1[i-1]可能越界

还有诸如下面的形式,你的成员能正常跑出结果吗?

print("sdads//fdfmd");

int a/*, b*/, c;

/*
Function: func
Parameter: x
*/

#2


最后读到文件尾,会先写入,再判断循环条件是否成立。i=0时,i-1越界吧

#3


引用 2 楼 kugeniha 的回复:
最后读到文件尾,会先写入,再判断循环条件是否成立。i=0时,i-1越界吧

那该怎么修改判断语句呢,我试了下用fscanf和fgets != EOF 不能解决问题

#4


最后再一个人的博客上看到了解释和解决方法
在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。
对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。
而我们经常这样把它使用在循环中:
int c;
while(!feof(fp))
{
c = fgetc(fp);
printf("%x\n",c);
}
它是先判断==>再读(可能这时就是文件尾了, 读不出东西了)
所以正确的代码应该是
int c;

c = fgetc(fp);
while(!feof(fp))
{
printf("%x\n",c);
c = fgetc(fp); 
}
原博地址:
http://blog.sina.com.cn/s/blog_a3e571160101irii.html