#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
*/
还有诸如下面的形式,你的成员能正常跑出结果吗?
print("sdads//fdfmd");
int a/*, b*/, c;
/*
Function: func
Parameter: x
*/
#2
最后读到文件尾,会先写入,再判断循环条件是否成立。i=0时,i-1越界吧
#3
那该怎么修改判断语句呢,我试了下用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
在读完文件的最后一个字符后,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
*/
还有诸如下面的形式,你的成员能正常跑出结果吗?
print("sdads//fdfmd");
int a/*, b*/, c;
/*
Function: func
Parameter: x
*/
#2
最后读到文件尾,会先写入,再判断循环条件是否成立。i=0时,i-1越界吧
#3
那该怎么修改判断语句呢,我试了下用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
在读完文件的最后一个字符后,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