用C++读取txt文件并将其中的有用信息储存在结构体数组中

我试了好多次,嗯……老有问题 感觉结果差不多了,但是通不过平台。文件中的开头有部分无用信息就不需要写入结构体数组当中。题目如下
这张中的三个函数是需要自己写的

img

下面是默认写好的代码

img

需要读取的文件大致是:
第一排 一句标题
第二排 书号 书名 定价
后面很多排就是具体信息。

下面是一个读取txt文件并将有用信息存储在结构体数组中的C++代码示例:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

struct Book {
    std::string bookNo;
    std::string bookName;
    double price;
};

std::vector<Book> readFile(const std::string& filename) {
    std::ifstream file(filename);
    std::vector<Book> books;

    if (file.is_open()) {
        std::string line;
        // 跳过无用信息
        std::getline(file, line);

        while (std::getline(file, line)) {
            Book book;
            std::stringstream ss(line);
            ss >> book.bookNo >> book.bookName >> book.price;
            books.push_back(book);
        }

        file.close();
    } else {
        std::cout << "无法打开文件: " << filename << std::endl;
    }

    return books;
}

int main() {
    std::string filename = "books.txt"; // 修改为你的文件路径
    std::vector<Book> books = readFile(filename);

    for (const auto& book : books) {
        std::cout << "书号: " << book.bookNo << std::endl;
        std::cout << "书名: " << book.bookName << std::endl;
        std::cout << "定价: " << book.price << std::endl;
        std::cout << std::endl;
    }

    return 0;
}

请注意,代码中的"books.txt"是文件的相对路径,你需要根据实际情况修改为你的文件路径。此外,如果你的文件编码不是纯文本格式(如UTF-8),可能需要在代码中进行相应的编码处理。

此代码使用了std::ifstream类来读取文件,并使用std::getline函数逐行读取文件内容。然后,它将每一行解析为结构体Book中的字段,并将Book对象存储在std::vector<Book>中。最后,程序输出每本书的信息。

如有其他问题,请随时问我。(如果可以的话就把悬赏给我吧)

img


钱)

首先,你需要创建一个结构体(struct)以储存你需要的信息。 假设你的txt文件中有如下内容:

Name Age Gender
Alice 20 Female
Bob 25 Male
Charlie 30 Male

你可以创建一个如下的结构体:

struct Person {
    std::string name;
    int age;
    std::string gender;
};

然后,你可以使用C++的文件输入流(ifstream)来读取txt文件,并将信息储存在结构体数组中。以下是一个示例代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

struct Person {
    std::string name;
    int age;
    std::string gender;
};

int main() {
    std::ifstream file("people.txt"); // Change this to your file path
    if (!file.is_open()) {
        std::cout << "Unable to open file";
        return 1; // error code
    }

    std::vector<Person> people;
    std::string line;
    while (std::getline(file, line)) {
        if (line.empty() || line[0] == '#') { // Skip empty lines or comments
            continue;
        }
        std::istringstream iss(line);
        std::string name;
        int age;
        std::string gender;
        if (!(iss >> name >> age >> gender)) { // Extract data from line
            break; // error in reading the file
        }
        Person p = {name, age, gender};
        people.push_back(p);
    }
    file.close();
    return 0; // success code
}

这个代码首先创建了一个ifstream对象来读取指定的txt文件,然后用getline函数来逐行读取文件。对于每一行,我们用istringstream对象来提取有用的信息,然后创建一个新的Person对象,并将其添加到vector中。如果getline函数返回false,或者istringstream对象无法提取有用的信息,那么我们就知道文件中存在错误,所以停止读取并返回错误代码。否则,我们成功读取了文件并返回成功代码。

【以下回答由 GPT 生成】

首先,我们可以使用C++中的文件流操作来读取txt文件。具体步骤如下:

  1. 打开txt文件并创建一个输入文件流对象。
  2. 读取文件的第一行,这是标题,可以直接忽略。
  3. 创建一个结构体来存储书号、书名和定价。结构体的成员变量类型根据文件中的具体数据类型进行定义。
  4. 创建一个结构体数组,用于存储所有的书籍信息。数组的长度可以根据实际情况确定。
  5. 循环读取文件的每一行,判断是否为有效的书籍信息。
  6. 如果是有效信息,则解析数据并存储在结构体数组中。

下面是一个示例代码,假设文件中的书号和定价都是整数类型,书名是字符串类型:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

// 结构体定义
struct Book {
    int bookNumber;
    string bookName;
    int price;
};

int main() {
    // 打开文件
    ifstream inputFile("books.txt");
    if (!inputFile) {
        cout << "文件打开失败!" << endl;
        return 0;
    }

    // 读取文件的第一行(标题),并忽略
    string title;
    getline(inputFile, title);

    // 创建结构体数组
    const int MAX_BOOKS = 100; // 假设最多有100本书
    Book books[MAX_BOOKS];
    int bookCount = 0;

    // 循环读取文件的每一行
    string line;
    while (getline(inputFile, line)) {
        // 解析数据并存储在结构体数组中
        int currentBookNumber, currentPrice;
        string currentBookName;
        if (sscanf(line.c_str(), "%d %s %d", &currentBookNumber, currentBookName.c_str(), &currentPrice) == 3) {
            books[bookCount].bookNumber = currentBookNumber;
            books[bookCount].bookName = currentBookName;
            books[bookCount].price = currentPrice;

            bookCount++;
        }
    }

    // 关闭文件
    inputFile.close();

    // 输出结构体数组中的书籍信息
    for (int i = 0; i < bookCount; i++) {
        cout << "书号:" << books[i].bookNumber << ", 书名:" << books[i].bookName << ", 定价:" << books[i].price << endl;
    }

    return 0;
}

请注意,这只是一个示例代码,具体实现可能需要根据实际情况进行调整和修改。另外,该示例代码假设每一行数据的书号、书名和定价之间都用空格分隔,如果实际文件中使用的是其他分隔符,需要相应地修改解析数据的代码。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

引用 皆我百晓生 小程序回复内容作答:
根据题目要求,我已经完善了代码如下:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct Book {
    string no;
    string name;
    float price;
};

struct SqList {
    Book* elem;
    int length;
};

void InitList(SqList& L) {
    L.elem = nullptr;
    L.length = 0;
}

void FreeList(SqList& L) {
    if (L.elem != nullptr) {
        delete[] L.elem;
        L.elem = nullptr;
    }
    L.length = 0;
}

void ReadFile(SqList& L, const string& filepath) {
    ifstream file(filepath);
    if (!file.is_open()) {
        cout << "Failed to open the file." << endl;
        return;
    }

    string line;
    getline(file, line); // 读取第一行标题
    cout << line << endl;

    getline(file, line); // 读取第二行标题
    cout << line << endl;

    int count = 0;
    while (getline(file, line)) {
        Book book;
        stringstream ss(line);
        getline(ss, book.no, '\t');      // 使用制表符分隔
        getline(ss, book.name, '\t');
        ss >> book.price;

        if (count == 0) {
            L.elem = new Book[1];
        } else {
            Book* temp = new Book[count + 1];
            for (int i = 0; i < count; i++) {
                temp[i] = L.elem[i];
            }
            delete[] L.elem;
            L.elem = temp;
        }

        L.elem[count] = book;
        L.length++;
        count++;
    }

    file.close();
}

int main() {
    SqList bookList;
    string filepath = "book.txt";

    InitList(bookList);
    ReadFile(bookList, filepath);

    for (int i = 0; i < bookList.length; i++) {
        cout << bookList.elem[i].no << " " << bookList.elem[i].name << " " << bookList.elem[i].price << endl;
    }

    FreeList(bookList);

    return 0;
}

上面的代码主要实现了读取指定文件("book.txt")中的图书信息,并将其存储在动态分配的数组中。注意,在指定的文件中,每个字段使用制表符 ('\t') 进行分隔。

在代码中,我们使用了 ifstream 类来打开并读取文件。首先,我们读取了文件的前两行标题,并将其打印输出。然后,我们通过逐行读取文件内容,并使用 stringstream 对每一行进行分隔和解析,将图书信息存储在 Book 结构体中。每当读取一行图书信息时,我们就动态调整 SqList 中的数组大小,并将图书信息放入数组中。最后,我们遍历输出所有图书信息并释放内存。

请注意,你需要将代码中的 book.txt 文件路径更改为你指定的文件路径。

参考代码


#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream inputFile("book.txt");

    if (!inputFile.is_open()) {
        cout << "无法打开文件 book.txt" << endl;
        return 1;
    }

    string line;

    // 读取并输出文件的前两行标题信息
    for (int i = 0; i < 2; i++) {
        getline(inputFile, line);
        cout << line << endl;
    }

    // 读取并输出图书信息
    while (getline(inputFile, line)) {
        string bookNumber, bookName, price;
        istringstream iss(line);
        
        // 使用空格分割每一行,前三个字段为书号、书名、和价格
        if (iss >> bookNumber >> bookName >> price) {
            cout << "书号: " << bookNumber << " 书名: " << bookName << " 价格: " << price << endl;
        } else {
            cout << "无效的图书信息: " << line << endl;
        }
    }

    inputFile.close();
    return 0;
}