while(!feof(fp)) //判断输入字符 { fscanf(fp,"%c",&singleChar); if(singleChar == '?') { Grammar[i][j] = '\0'; break; } if(singleChar == '\n') { Grammar[i][j]='\0'; i++; j = 0; continue; } if(singleChar == '-') { tp = fp;
时间: 2023-06-15 09:07:36 浏览: 179
这段代码的作用是从文件中读取文本,将其存储在一个二维字符数组Grammar中。具体来说,代码首先使用while循环读取文件中的字符,直到文件结束。在循环中,使用fscanf从文件中读取一个字符,并将其存储在变量singleChar中。接着,代码使用if语句判断读取的字符是否为问号"?"。如果是,表示当前语法规则已经读取完毕,将其存储在二维字符数组Grammar中,并退出当前循环。如果读取的字符为换行符"\n",表示当前行已经读取完毕,将其存储在二维字符数组Grammar中,并将行数i加1,列数j重置为0。如果读取的字符为"-",则将文件指针tp指向当前位置,但是代码没有给出后续的处理流程,因此无法判断其具体作用。
相关问题
int read(FILE *fp)//读文件,并返回行数 { int row=0; char mid; while(!feof(fp)) { mid=fgetc(fp); //从txt文本中读取一个字符赋值给mid if(mid=='\n') //如果这个字符为换行符 row++; //记录txt数据行数 } row++; //最后一行没有换行符 rewind(fp); //回文件起始位置 return(row); } 以上代码我应该添加什么使得row不统计空行?
要使`row`不统计空行,你可以在判断换行符后加上一个条件来排除空行。修改后的代码如下所示:
```c
int read(FILE *fp) // 读文件,并返回行数
{
int row = 0;
char mid;
while (!feof(fp))
{
mid = fgetc(fp); // 从txt文本中读取一个字符赋值给mid
if (mid == '\n' && row > 0) // 如果这个字符为换行符且不是第一行(空行)
row++; // 记录txt数据行数
}
row++; // 最后一行没有换行符
rewind(fp); // 回文件起始位置
return row;
}
```
这样修改后,只有当`row`大于0时才会将其递增,从而排除了第一行为空的情况。
while(!feof(fp))
`while(!feof(fp))` 是 C/C++ 中的一种文件操作循环结构,`feof` 是 `stdio.h` 函数库中的一个宏,它检查指定的文件指针 (`fp`) 是否已到达文件结束(EOF)。`!feof(fp)` 的意思是只要文件指针还指向有效位置,即没有达到文件结尾,循环就会继续执行。
在遍历文件内容时,这种结构通常用于读取文件直到遇到文件结尾。例如:
```c
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r"); // 打开文件
if (fp == NULL) {
// 文件打开失败处理
}
char ch;
while (!feof(fp)) { // 当未到文件结束时
ch = fgetc(fp); // 读取一个字符
if (ch != EOF) {
printf("%c", ch);
} else {
break; // 到达文件结束,跳出循环
}
}
fclose(fp); // 关闭文件
return 0;
}
```
阅读全文