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

Posted

技术标签:

【中文标题】如何逐字读取文件并将这些单词分配给结构? [复制]【英文标题】:How to read in from a file word by word and assign those words to a struct? [duplicate] 【发布时间】:2021-04-14 20:20:21 【问题描述】:

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

1
Elementary_Particles Michel_Houllebecq

然后我有一个图书对象的结构

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?

谢谢

【问题讨论】:

显然答案是一次阅读两个单词,例如while (file &gt;&gt; str1 &gt;&gt; str2) b[count].title = str1; b[count].author = str2; count++; 【参考方案1】:

在这段代码中

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

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

一些额外的提示和想法:

while(!file.eof() is not what you want,而是将输入操作放入循环条件中。并且可以跳过中间字符串直接读入title/author

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

【讨论】:

谢谢!所以文本文件实际上有比作者和标题更多的字段,它还有页码。那么将文件输入字符串转换为int的方法是什么?我可以做 file >> std:::stoi(b[count].pages) 吗? file &gt;&gt; b[count].pages 就足够了。它的工作原理就像您从 std::cin 读取输入一样。

以上是关于如何逐字读取文件并将这些单词分配给结构? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何一次读取一个字符的字符串或文件并将该字符的 ASCII 值分配给 CMD 批处理中的变量? [复制]

如何将csv中的单词分配给变量? [复制]

C++ 从文本文件中逐字读取单词或逐字符读取单词

如何从文件中读取单词,将它们分配给数组并分析其内容?

从文件中读取而不跳过空格

逐字读取文件,扫描仪