while (fgets(line, sizeof(line), charFile)) { int result = evaluate(charFile); printf("%d\n", result); }该代码会导致文件第一行丢失,怎么解决
时间: 2023-08-03 08:03:57 浏览: 71
这个问题的原因是在第一次调用 `fgets` 函数时已经将文件指针指向了文件的第二行,导致第一行被跳过了。解决这个问题有两种方法:
1. 在第一次调用 `fgets` 函数之前,先把文件指针重新指向文件的开头,可以使用 `rewind` 函数实现:
```c
rewind(charFile); // 将文件指针重新定位到文件开头
while (fgets(line, sizeof(line), charFile)) {
int result = evaluate(charFile);
printf("%d\n", result);
}
```
2. 将 `evaluate` 函数的参数改为 `line`,这样就可以直接从读取的第一行开始处理:
```c
while (fgets(line, sizeof(line), charFile)) {
int result = evaluate(line);
printf("%d\n", result);
}
```
相关问题
fgets(line, sizeof(line), charFile);
`fgets(line, sizeof(line), charFile)` 是 C 语言标准库函数中用于从文件中读取一行数据的函数。它的作用是从指定的文件流 `charFile` 中读取一行数据,存储到字符数组 `line` 中,并返回该字符数组的地址。其中,`sizeof(line)` 表示字符数组 `line` 的大小,即最多可以读取的字符数(包括换行符);`charFile` 是文件指针,用于指定要读取的文件;`line` 是字符数组,用于存储读取的数据。如果读取成功,则返回 `line` 的地址,否则返回 `NULL`。
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; int isNumber(char c) { return (c >= '0' && c <= '9'); } int turnToInteger(char c) { return (int)(c - '0'); } int evaluate(FILE* charFile) { int result = 0; char c = fgetc(charFile); if (c == '(') { char op = fgetc(charFile); int arg1 = evaluate(charFile); int arg2 = evaluate(charFile); fgetc(charFile); // 取出')' switch (op) { case '+': result = arg1 + arg2; break; case '-': result = arg1 - arg2; break; case '*': result = arg1 * arg2; break; case '/': result = arg1 / arg2; break; default: cout << "Invalid operator: " << op << endl; exit(1); break; } } else if (isNumber(c)) { result = turnToInteger(c); } else { cout<<"Invalid character: "<<c<<endl; exit(1); } return result; } int main() { FILE* charFile; fopen_s(&charFile, "D:\\test.txt", "r"); if (!charFile) { cout << "Failed to open file!" << endl; return 1; } char line[100]; int a = 0; while (fgets(line, sizeof(line), charFile)) a++; fseek(charFile, 0, SEEK_SET); for(int i=0;i<a;i++) { int result = evaluate(charFile); fgets(line, sizeof(line), charFile); cout<< result<<endl; } fclose(charFile); return 0; }加注释
注释如下:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
// 判断字符是否为数字
int isNumber(char c)
{
return (c >= '0' && c <= '9');
}
// 将字符转化为整数
int turnToInteger(char c)
{
return (int)(c - '0');
}
// 递归计算表达式的值
int evaluate(FILE* charFile)
{
int result = 0;
char c = fgetc(charFile);
if (c == '(') // 如果字符是'(',则开始计算表达式
{
char op = fgetc(charFile); // 取出操作符
int arg1 = evaluate(charFile); // 递归计算第一个参数
int arg2 = evaluate(charFile); // 递归计算第二个参数
fgetc(charFile); // 取出')'
switch (op) // 根据操作符进行计算
{
case '+':
result = arg1 + arg2;
break;
case '-':
result = arg1 - arg2;
break;
case '*':
result = arg1 * arg2;
break;
case '/':
result = arg1 / arg2;
break;
default:
cout << "Invalid operator: " << op << endl;
exit(1);
break;
}
}
else if (isNumber(c)) // 如果字符是数字,则直接转化为整数
{
result = turnToInteger(c);
}
else // 如果字符既不是'('也不是数字,则是非法字符
{
cout<<"Invalid character: "<<c<<endl;
exit(1);
}
return result;
}
int main()
{
FILE* charFile;
fopen_s(&charFile, "D:\\test.txt", "r"); // 打开文件
if (!charFile) {
cout << "Failed to open file!" << endl;
return 1;
}
char line[100];
int a = 0;
while (fgets(line, sizeof(line), charFile)) // 统计文件行数
a++;
fseek(charFile, 0, SEEK_SET); // 将文件指针移回文件开头
for(int i=0;i<a;i++) // 循环读取每一行表达式,并计算结果
{
int result = evaluate(charFile);
fgets(line, sizeof(line), charFile); // 读取当前行的换行符
cout<< result<<endl;
}
fclose(charFile); // 关闭文件
return 0;
}
```