这是我的困境。我有一个文件,并希望读取所有字符,直到程序达到'#',并忽略'#'后该行上的所有内容。例如
0 4001232 0 #comment,discard
这令人沮丧,因为感觉有一个非常简单的解决方案。谢谢!
答案 0 :(得分:2)
FILE *f = fopen("file.txt", "r");
int c;
while ((c = getc(f)) != '#' && c != EOF)
putchar(c);
答案 1 :(得分:1)
有很多方法和例子可以做到这一点。通常,想法是拥有一个保持状态的变量(在#之前,在#之后,在\ n之后等)并且在while循环中运行直到EOF。你可以看到一个例子here这是一个删除C评论的程序,但想法是一样的。
答案 2 :(得分:1)
filePointer = fopen("person.txt", "r");
do
{
read = fgetc(filePointer);
//stop when '#' read or when file ends
if (feof(filePointer) || read == '#')
{
break;
}
printf("%c", read);
} while (1);
fclose(filePointer);
还最好检查文件是否成功打开
if (filePointer == NULL)
{
printf("person.txt file failed to open.");
}
else
{
file operations
}
答案 3 :(得分:0)
解决方案取决于你如何“阅读”。
例如,我可以在bash中使用sed 's/#.*//' <infile >outfile
删除所有这些评论。
编辑:但是,如果我手动解析它,我可以简单地(在我的循环中解析它)
if(line[i]=='#') {
continue;
}
通过退出循环停止解析该行。
答案 4 :(得分:0)
使用fgets读取一行,仔细阅读此行,直至找到“#”字符。
阅读另一行......
答案 5 :(得分:0)
这是一个预处理,而不是在脑海中解析问题。无论如何,有许多工具和命令专门做你所要求的。如果可能的话,最好使用它们。
但是,如果您需要或想要在代码中执行此操作,那么这样做的一般方法就是如前所述,保持当前状态并根据状态处理任何新字符。这是一种非常好的通用方法,强烈推荐,特别是需要进行更多的预处理。
然而,如果这绝对是你唯一要做的事情,那么你可以做一些更好的事情并用这样的代码放弃状态:
do {
// Initialize things (buffer for the characters maybe) per line
ch = fgetc(input_file);
while ( (ch != EOF) && (ch != '\n') && (ch != '#') ) // Assuming # is the comment character
{
// Do something with 'ch', save it to a buffer, give it to a function - whatever
ch = fgetc(input_file);
}
// If you save the characters to a buffer, this will be a good time to do something with it
while ( (ch != EOF) && (ch != '\n') ) ch = fgetc(input_file); // Read the rest of the line
while ( ch != EOF );