數據格式
大學英語B 4.0 2.67
高等數學下 6.0 3.67
離散數學上 2.5 3.67
...
結構體定義
struct Course {
char name[20];
float credit;
float mark;
};
Course courses[N];
讀取解析代碼
#include <fstream>
#include <sstream>
#include <string>
int readCourses(const char* filename, Course* courses, int maxCount) {
std::ifstream fin(filename);
if (!fin) return -1;
std::string line;
int idx = 0;
while (std::getline(fin, line) && idx < maxCount) {
if (line.empty()) continue;
std::istringstream iss(line);
std::string name;
float credit, mark;
// 假設課程名無空格,否則需按最後兩個浮點數分割
if (iss >> name >> credit >> mark) {
strncpy(courses[idx].name, name.c_str(), 19);
courses[idx].name[19] = '\0';
courses[idx].credit = credit;
courses[idx].mark = mark;
idx++;
}
}
return idx;
}
關鍵點
- 用
std::getline 逐行讀取,避免格式錯誤導致流狀態異常;
std::istringstream 自動按空白字符分割,配合 >> 直接提取數值;
- 字符串轉浮點由流提取自動完成(相當於
atof);
- 課程名含空格時,需從行尾反向提取兩個 float,剩餘作為名稱。