这段代码有何问题cities* citiesArray(FILE* Fp) { if (!opencsv1(Fp)) { cout << "error for opening" << endl; return NULL; } int nLine = Line_n(Fp); char* pcLine = NULL; char* cFinal = NULL; struct cities* pCity = new cities[nLine]; char cLine[256] = { 0 }; fseek(Fp, 0, 0); for (int j = 0; j < nLine; j++) { pcLine = fgets(cLine, 256, Fp); cFinal = strtok(pcLine, ","); while (cFinal != NULL) { strcpy(pCity[j].cNation, cFinal); cFinal = strtok(NULL, ","); strcpy(pCity[j].cCity, cFinal); cFinal = strtok(NULL, ","); pCity[j].dLatitude = atof(cFinal); cFinal = strtok(NULL, ","); pCity[j].dLongitude = atof(cFinal); cFinal = strtok(NULL, ","); } } return pCity; }
时间: 2024-01-04 22:03:27 浏览: 69
这段代码可能存在以下问题:
1. 函数返回类型应该为 `cities*` 而非 `citiesArray`,可能是笔误。
2. 函数内部定义的 `struct cities* pCity` 数组没有释放,存在内存泄漏的风险。
3. 读取文件内容时,如果一行中逗号数量不足 3 个,会导致程序崩溃或者结果不正确。
4. 读取文件内容时,逗号后面的字段如果包含空格或其他特殊字符,可能会导致结果不正确。
5. 函数内部使用了 C 风格字符串处理函数 `strcpy` 和 `strtok`,可能存在缓冲区溢出的风险。
建议改进的地方:
1. 修改返回类型为 `cities*`。
2. 添加释放 `pCity` 数组内存的代码。
3. 使用更加健壮的文件读取方式,例如使用 C++ 的 `std::ifstream` 或者第三方库。
4. 使用更加健壮的字符串处理方式,例如使用 C++11 的 `std::string` 和 `std::getline`。
5. 添加足够的容错机制,例如判断读取的字段数是否符合预期,判断字符串长度是否超出预期。
相关问题
这段用来读取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; }
这段代码有几个问题:
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;
}
```
阅读全文