如何逐字读取文件并将这些单词分配给结构体?[复制]

How to read in from a file word by word and assign those words to a struct? [duplicate]

提问人:madaniloff 提问时间:1/9/2021 更新时间:1/9/2021 访问量:338

问:

在我的项目中,我有一个 .txt 文件,顶部是书籍的数量,然后是一本书的标题及其作者用空格分隔,例如:

1
Elementary_Particles Michel_Houllebecq

然后,我有一个 book 对象的结构

struct book {
    string title;
    string author;
};

由于有多个书籍和作者,因此存在这些书籍对象的书籍数组。我需要做的是逐字逐句地阅读这些内容,并将标题分配给 book.title,将作者分配给 book.author。这是我到目前为止所拥有的:

void getBookData(book* b, int n, ifstream& file) { //n being the number at the top of the file
    int count = 0;
    string file_string;
    while(!file.eof() && count != n-1) {
       while (file >> file_string) {
           b[count].title = file_string;
           b[count].author = file_string;
           count++;
   }
}

当我使用这些输出运行它时:

cout << book[0].title << endl;
cout << book[0].author << endl;

我得到:

Elementary_Particles
Elementary_Particles

基本上,它只取第一个词。如何使第一个单词分配给 book.title,将下一个单词分配给 book.author?

谢谢

C++ 文件 结构 ifstream eof

评论

1赞 john 1/9/2021
显然,答案是一次阅读两个单词,例如while (file >> str1 >> str2) { b[count].title = str1; b[count].author = str2; count++; }

答:

3赞 Lukas-T 1/9/2021 #1

在这段代码中

while (file >> file_string) {
      b[count].title = file_string;
      b[count].author = file_string;
      count++;
}

你读了一个单词,并为标题和作者分配了相同的值,不要指望编译器会猜到你的意图;)

一些额外的提示和想法:

while(!file.eof() 不是你想要的,而是将输入操作放入循环条件中。你可以跳过中间字符串,直接读入 /:titleauthor

void getBookData(book* b, int n, ifstream& file) {
    int count = 0;
    while((file >> b[count].title >> b[count].author) && count != n-1) {
        count++;
    }
}

评论

0赞 madaniloff 1/10/2021
谢谢!因此,文本文件实际上比作者和标题有更多的字段,它还具有页码。那么有什么方法可以将文件输入字符串转换为 int 呢?我可以>> std:::stoi(b[count].pages)进行文件吗?
0赞 Lukas-T 1/10/2021
file >> b[count].pages就足够了。它的工作方式就像您从 中读取输入一样。std::cin