这段用来读取csv文件的代码有什么问题bool opencsv1(FILE* fp) { fp = fopen("cities.csv", "r"); if (fp == NULL) { printf("error for opening"); return 0; } fclose(fp); char ch; float f; int i = 0, j; cities ct[199] = { 0 }; while (!feof(fp)) { ch = fgetc(fp); for (; ch != ','; ch = fgetc(fp)) { cout << "ee" << endl; ct[i].cCity += ch; } fscanf(fp, "%f,", &f); ct[i].dLatitude = f; fscanf(fp, "%f\n", &f); ct[i].dLongitude = f; i++; } return 1; }
时间: 2024-01-03 12:03:22 浏览: 89
这段代码有几个问题:
1. 在打开文件后,立即关闭了文件,这意味着在之后的代码中无法使用该文件指针进行文件操作。
2. 在读取文件时,使用了feof函数来检查文件是否结束,这是不可靠的,因为feof函数会在文件结束之前返回false,而在文件结束后才返回true。因此,应该使用fscanf函数的返回值来检查文件是否结束。
3. 在读取文件时,使用了fgetc函数读取字符,这是不必要的,因为可以直接使用fscanf函数读取整行数据并解析。
以下是修改后的代码:
```c++
bool opencsv1() {
FILE* fp = fopen("cities.csv", "r");
if (fp == NULL) {
printf("error for opening");
return false;
}
char buffer[1024];
int i = 0;
cities ct[199] = { 0 };
while (fgets(buffer, 1024, fp) != NULL) {
sscanf(buffer, "%[^,],%f,%f\n", ct[i].cCity, &ct[i].dLatitude, &ct[i].dLongitude);
i++;
}
fclose(fp);
return true;
}
```
相关问题
为以下函数添加注释bool opencsv2(FILE* Ep) { FILE* fp1 = fopen("routes.csv", "r"); if (!fp1) { printf("error1!"); return 0; } int i = 0; routes route[MAXX] = { 0 }; route[i].cStartCity[64] = { 0 }; route[i].cEndCity[64] = { 0 }; char ch = fgetc(fp1); while (!feof(fp1)) { while (ch != ',') { route[i].cStartCity[64] += ch; ch = fgetc(fp1); } ch = fgetc(fp1); while (ch != ',') { route[i].cEndCity[64] += ch; ch = fgetc(fp1); } while (ch != ',') { route[i].cTripMode[64] += ch; ch = fgetc(fp1); } fscanf(fp1, "%f,", &route[i].dTime); fscanf(fp1, "%f,", &route[i].dCost); } return 1; }
/**
* @brief 从指定文件中读取路线信息并存储到数组中
*
* @param Ep 指向待写入的文件的指针
* @return 成功返回1,否则返回0
*/
bool opencsv2(FILE* Ep) {
FILE* fp1 = fopen("routes.csv", "r"); // 打开路线文件
if (!fp1) { // 如果打开失败
printf("error1!");
return 0; // 返回错误
}
int i = 0; // 初始化路线数组下标
routes route[MAXX] = { 0 }; // 定义路线数组
route[i].cStartCity[64] = { 0 }; // 初始化起始城市字符串
route[i].cEndCity[64] = { 0 }; // 初始化终点城市字符串
char ch = fgetc(fp1); // 获取文件中的一个字符
while (!feof(fp1)) { // 当文件没有结束时
while (ch != ',') { // 当字符不是逗号时
route[i].cStartCity[64] += ch; // 将字符加入起始城市字符串中
ch = fgetc(fp1); // 获取下一个字符
}
ch = fgetc(fp1); // 跳过逗号
while (ch != ',') { // 当字符不是逗号时
route[i].cEndCity[64] += ch; // 将字符加入终点城市字符串中
ch = fgetc(fp1); // 获取下一个字符
}
while (ch != ',') { // 当字符不是逗号时
route[i].cTripMode[64] += ch; // 将字符加入旅行方式字符串中
ch = fgetc(fp1); // 获取下一个字符
}
fscanf(fp1, "%f,", &route[i].dTime); // 读取时间信息
fscanf(fp1, "%f,", &route[i].dCost); // 读取费用信息
}
return 1; // 返回成功
}
有无问题bool SuccessfulOpen(FILE* Fp) { if (NULL == Fp) return true; else return false; }
这个函数的逻辑有误。如果文件指针 `Fp` 为空指针,则返回 true,表示打开文件成功;否则返回 false,表示打开文件失败。这显然是错误的。正确的逻辑应该是,如果文件打开成功,则返回 true,表示操作成功;否则返回 false,表示操作失败。修改后的代码如下:
```c
bool SuccessfulOpen(FILE* fp) {
if (fp != NULL) {
return true; // 打开文件成功
}
else {
return false; // 打开文件失败
}
}
```
或者更简洁地写成:
```c
bool SuccessfulOpen(FILE* fp) {
return (fp != NULL);
}
```
这样,当 `fp` 为空指针时,函数返回 false,表示操作失败;否则返回 true,表示操作成功。
阅读全文