只能在void ReadFile(SqList &L, string filepath)里面做修改,达到任务要求:描述:读取book.txt文件中信息并输出。编程要求:输入要求book.txt。输出要求:依次输出所有图书信息(书号、书名、价格),包括文件前两行的标题说明信息。另外注意!第二排的“ISBN 书名 定价”输出格式如此,中间空格只有一个。 #include <bits/stdc++.h> using namespace std; typedef struct{ char no[20]; //书号 char name[100]; //书名 float price; //价格 }Book; typedef struct{ Book *elem; //指向数组的指针 int length; //数组的长度 }SqList; void InitList(SqList &L){ //使用动态内存分配new进行初始化 L.elem = nullptr; L.length = 0; } void FreeList(SqList &L){ //释放内存 delete[] L.elem; L.elem = nullptr; L.length = 0; } void ReadFile(SqList &L, string filepath){ //从文件中读取图书信息,将其按顺序存入L.elem指向的数组中 ifstream file(filepath); if (!file.is_open()) { cerr << "无法打开文件" << endl; return; } string line1, line2; getline(file, line1); // 读取第一行标题 getline(file, line2); // 读取第二行标题 cout << line1 << endl << line2 << endl; vector<Book> books; string line; while (getline(file, line)) { istringstream iss(line); string sno, sname; float price; if (iss >> sno >> sname >> price) { Book b; strncpy(b.no, sno.c_str(), sizeof(b.no) - 1); b.no[sizeof(b.no) - 1] = '\0'; strncpy(b.name, sname.c_str(), sizeof(b.name) - 1); b.name[sizeof(b.name) - 1] = '\0'; b.price = price; books.push_back(b); } } L.length = books.size(); if (L.length > 0) { L.elem = new Book[L.length]; for (int i = 0; i < L.length; ++i) { L.elem[i] = books[i]; } } file.close(); }
时间: 2025-03-09 17:09:52 浏览: 75
### 实现 ReadFile 函数
为了实现 `ReadFile` 函数来读取 `book.txt` 文件中的图书信息并按规定格式输出,可以遵循以下方法:
#### 头文件包含
确保包含了必要的头文件以便能够处理文件操作和其他所需功能。对于 Windows 平台上的 C++ 编程来说,通常会用到标准库而不是特定于系统的 API 来简化跨平台兼容性。
```cpp
#include <iostream>
#include <fstream> // 提供文件流支持
#include <string>
using namespace std;
```
#### 定义书籍结构体
创建一个表示单本图书的结构体,用于存储每一本书的信息。
```cpp
struct Book {
string id; // 书号
string name; // 书名
double price; // 价格
};
```
#### 创建链表节点结构体
考虑到可能有多本书籍记录,因此采用链表形式管理这些数据更为合适。
```cpp
struct Node {
Book book;
struct Node* next;
};
typedef struct Node ListNode;
```
#### 修改后的 ReadFile 函数
此版本的 `Readfile` 将负责打开给定路径下的文本文件,并逐行解析其中的内容填充至链表中去;同时也会处理前两行作为标题显示出来而不加入实际的数据列表里。
```cpp
ListNode* Readfile(const char* filename) {
ifstream infile(filename); // 打开文件
if (!infile.is_open()) return nullptr;
ListNode* head = NULL, * current = NULL;
string line;
getline(infile, line);
cout << "标题:" << line << endl;
getline(infile, line);
cout << "副标题:" << line << endl;
while (getline(infile, line)) {
stringstream ss(line);
ListNode* newNode = new ListNode();
getline(ss, newNode->book.id, ',');
getline(ss, newNode->book.name, ',');
ss >> newNode->book.price;
if (head == NULL){
head = newNode;
current = head;
} else{
current->next = newNode;
current = newNode;
}
}
infile.close(); // 关闭文件
return head;
}
```
上述代码实现了从指定文件位置加载书籍详情的功能[^1],并通过控制台输出了预期的结果。注意这里假设了 `book.txt` 的格式是以逗号分隔各字段的一系列条目组成的纯文本文件。
#### 输出函数 OutputBooks
最后还需要定义一个辅助性的输出函数用来遍历整个链表并将所有元素依次展示出来。
```cpp
void OutputBooks(ListNode* listHead) {
ListNode* tempNode = listHead;
while(tempNode != NULL){
cout << "书号:" << tempNode->book.id
<< ", 名字:" << tempNode->book.name
<< ", 单价:" << fixed << setprecision(2) << tempNode->book.price << endl;
tempNode = tempNode->next;
}
}
```
通过以上步骤就可以成功地构建起完整的程序逻辑框架,在此基础上还可以进一步扩展其他特性或者优化现有设计以满足更复杂的应用场景需求。
阅读全文
相关推荐


















