【发布时间】:2021-04-05 11:34:56
【问题描述】:
我有一个用 C++ 编写的程序,它会生成具有相同教师姓名的文件,这些文件还要按时间顺序(按天和小时)排序:
<hour> <day> <group> <surname> <subject>
(这里是example.txt内容):
10:15-11:30 Friday gr1 Smith Programming
07:10-09:15 Wednesday gr2 Taylor InternetofThings
11:00-12:00 Monday gr2 Smith Java
10:20-11:45 Thursday gr1 Taylor Matchematic
工作后,程序生成文件:
Smith.txt :
11:00-12:00 Monday gr2 Java
10:15-11:30 Friday gr1 Programming
Taylor.txt :
07:10-09:15 Wednesday gr2 InternetofThings
10:20-11:45 Thursday gr1 Matchematic
我已经设法将 txt 文件中的数据加载到动态数组中(代码如下)。我不知道如何进行名称搜索和排序(名称可以不同,行数也可以不同)。我正在考虑一个循环,它会从动态数组的“姓”变量中查找相同的字母,但我不知道如何实现它。
struct Line {
string hour;
string day;
string group;
string surname;
string subject;
};
void readLine(ifstream& file, Line& line) {
file >> line.hour >> line.day >> line.group >> line.surname >> line.subject;
}
void readLineTab(ifstream& file, Line* lineTab, const int numOfLines) {
for (int i = 0; i < numOfLines; i++) {
readLine(file, lineTab[i]);
}
}
void printLine(const Line& line) {
cout << line.hour << " " << line.day << " " << line.group << " " << line.surname << " " <<
line.subject << endl;
}
void printLineTab(Line* lineTab, const int size) {
for (int i = 0; i < size; i++) {
printLine(lineTab[i]);
}
}
int checkFile(string& filePath, int& numOfLines) {
ifstream file;
file.open(filePath.c_str());
if (file.fail()) {
cerr << "Error file open: " << filePath << endl;
file.close();
return 1;
}
string line;
int lineNr = 0;
while (getline(file, line)) {
lineNr++;
numOfLines++;
}
file.close();
return 0;
}
int main(int argc, char** argv) {
int numOfLines = 0;
ifstream file;
string filePath = "example.txt";
if (checkFile(filePath, numOfLines)) {
return 1;
}
Line* lineTab = new Line[numOfLines];
file.open(filePath.c_str());
if (file.fail()) {
cerr << "Error file open: " << filePath << endl;
return 1;
}
readLineTab(file, lineTab, numOfLines);
printLineTab(lineTab, numOfLines);
delete[] lineTab;
file.close();
return 0;
}
【问题讨论】:
-
您可能需要
std::map<std::string,Line>或std::unordered_map<std::string,Line>来执行此操作,但请注意,这些密钥字符串必须是唯一的。如果不是,您将需要std::multimap<std::string,Line>。你可以在这里找到这些类的文档:en.cppreference.com/w/cpp/container -
您是否被限制使用标准库中的容器类?
-
一种简单的方法是只读取一行,检查是否存在教师文件,如果不存在则创建一个。如果确实存在,请将数据附加到文件中。
-
std::string.find(str2) 是用于在str中查找str2的工具。
-
当您想按天排序时,您应该将日期名称转换为可排序的周索引(星期一=1,...,星期六=6)。然后按 1/ 姓氏、2/ 周索引 3/ 小时对数组进行排序。完成后,只需写入已排序的数组,如果姓氏已更改,则打开一个新文件(以空姓氏开头以在第一条记录上创建一个新文件)。顺便说一句,如果你可以使用
std::map容器,它会更容易实现。
标签: c++ sorting struct dynamic-arrays fromfile