fgetc()读取.csv文件
时间: 2023-07-15 14:12:29 浏览: 83
可以使用以下代码来读取 .csv 文件:
```c
#include <stdio.h>
int main() {
FILE* fp = fopen("data.csv", "r");
char c;
if (fp == NULL) {
printf("Could not open file.\n");
return 1;
}
while ((c = fgetc(fp)) != EOF) {
printf("%c", c);
}
fclose(fp);
return 0;
}
```
在这个例子中,我们使用 `fopen()` 来打开名为 `data.csv` 的文件,并以只读模式打开它。如果文件无法打开,我们将输出一条错误消息并返回 1。
然后我们使用 `fgetc()` 函数从文件中读取每个字符,并在循环中将其打印出来。当我们读取到文件的结尾时, `fgetc()` 将返回 `EOF`,我们就退出循环。
最后,我们使用 `fclose()` 函数关闭文件。
相关问题
这段用来读取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;
}
```
为以下函数添加注释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; // 返回成功
}
阅读全文