使用c将选定的文本从文件写入txt文件

  • 本文关键字:文件 txt 文本 使用 c
  • 更新时间 :
  • 英文 :


开头说,我一直潜伏在Stackoverflow中,这是我的第一个问题,但是感谢你们所有善良的灵魂的贡献!我正试图使用C编程从。java文件到。txt文件编写注释和类。我使用fgetc和fputc函数来做到这一点,并设法编写整个文件,但是当我试图沟通时,我只想要到类的注释(所以在"{"之前)。在"}"之后的一切,它似乎不打印任何东西。我对C很陌生,只是有点困。我已经包括我的代码下面,任何帮助将是超级赞赏。对不起,如果这是难以理解的,我的母语不是英语。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *input = fopen("text.java", "r"); //opens file
FILE *comments = fopen("comments.txt", "w");
char ch;
ch = fgetc(input);
while(ch != EOF)
{
while(!strcmp(ch, "{"))
{
fputc(ch, comments);

ch = fgetc(input);
}
ch = fgetc(input);
}

fclose(input);
fclose(comments);

return 0;

}

正如其他人在注释部分已经指出的那样,您的代码有以下错误:

  1. fgetc的返回类型是int,不是char。值EOF不能在char中表示,因此不应该将int的返回值截断为char。相反,您应该将ch声明为int

  2. strcmp函数用于比较字符串,而不是字符。

  3. 当在你的内部循环中调用fgetc时,你没有检查EOF的返回值。

而且,你解决这个问题的算法似乎也不正确。

解决这个问题的一种方法是让程序始终记住它是否在大括号内,并相应地采取行动。例如,您可以声明一个bool inside_brace变量,它总是指定您是否在大括号内,像这样:

#include <stdio.h>
#include <stdlib.h>
//the following line is necessary for the "bool" data type
#include <stdbool.h>
int main( int argc, char **argv )
{
FILE *input = fopen("text.java", "r");
FILE *comments = fopen("comments.txt", "w");
int ch;
bool inside_brace = false;
while ( ( ch = fgetc(input) ) != EOF )
{
if ( !inside_brace )
{
if ( ch == '{' )
{
inside_brace = true;
continue;
}
fputc( ch, comments );
}
else //inside a brace
{
if ( ch == '}' )
{
inside_brace = false;
continue;
}
}
}
fclose(input);
fclose(comments);
return EXIT_SUCCESS;       
}

注意,这个解决方案将只工作,如果你只有一个嵌套级别的花括号,也就是说,你不让一个{在另一个{没有首先关闭第一个{}。如果可能有一个以上的嵌套层,那么变量bool inside_brace是不够的。相反,您需要一个计数器来跟踪当前的嵌套级别,例如:

#include <stdio.h>
#include <stdlib.h>
int main( int argc, char **argv )
{
FILE *input = fopen("text.java", "r");
FILE *comments = fopen("comments.txt", "w");
int ch;
int nesting_level = 0;
while ( ( ch = fgetc(input) ) != EOF )
{
switch ( ch )
{
case '{':
nesting_level++;
continue;
case '}':
nesting_level--;
if ( nesting_level < 0 )
{
fprintf( stderr, "Error: Negative nesting level encountered!n" );
return EXIT_FAILURE;
}
continue;
}
if ( nesting_level == 0 )
fputc( ch, comments );
}
}
fclose(input);
fclose(comments);
return EXIT_SUCCESS;       
}

最新更新