繁体   English   中英

如何从文本文件中读取数据并将其分配给变量? (C++)

[英]How to read data from text file and assign it to variables? (C++)

所以假设我有一个名为“items.txt”的文本文件,其中包含

0|Item Name|Item Desc 1
1|Item Name 1|Item Desc 1

.txt 文件中的每个项目在行的开头都有一个 ID、一个名称和一个描述。 例如,我如何制作一个程序来打印 ID 为 1(名称、描述)的项目的所有信息?

首先,您需要一个分隔符来知道Name在哪里结束以及Desc在哪里开始。 假设它是| 你在你的例子中使用过。 此外,为简单起见,我们假设您在文件的开头有一个数字N ,以便您知道其中存储了多少项。 所以我们尝试阅读这样的内容:

在文件items.txt

2
123|Sword|A basic sword.
124|Bow|A basic bow.

您没有说明您打算如何存储每个Item的数据,因此我将创建一个Item struct

struct Item
{
    unsigned int nID;
    char Name[64];
    char Desc[128];
}

现在有一个从文件中读取项目的函数。

Item* ReadItems(std::ifstream& fin, unsigned long& nItemCount)
{
    fin >> nItemCount;
    Item* pItems = new Item[nItemCount];

    for(unsigned long i = 0; i < nItemCount; i++)
    {
        fin >> pItems[i].nID;

        char NameAndDesc[195];
        fin.getline(NameAndDesc, 195);

        char* p = strtok(NameAndDesc, "|");
        strcpy(pItems[i].Name, p);

        p = strtok(NULL, "|");
        strcpy(pItems[i].Desc, p);
    }

    return pItems;
}

在您的主文件中,您还需要声明文件、处理错误检查并释放用于存储项目的Items数组:

int main()
{
    Item* Items;
    unsigned long nItemCount;

    std::ifstream fin("items.txt");
    if (!fin.good())
    {
        std::cout << "Invalid file given.\n";
        return -1;
    }

    try{Items = ReadItems(fin, nItemCount);}
    catch(std::bad_alloc& except)
        {std::cout << except.what(); return -1;}


    for(unsigned long i = 0; i < nItemCount; i++)
    {
        std::cout << "Item with ID = " << Items[i].nID << " has the name '" << Items[i].Name << "'.\n";
        std::cout << "Description: " << Items[i].Desc << "\n\n";
    }
    std::cout << "-----------------------------\n";
    std::cout << "Total items read: " << nItemCount << "\n";

    delete [] Items;

    return 0;
}

现在,您在一个数组中拥有了您需要的所有项目。 您可以对它们进行任何检查和修改。


要专门回答这个问题,您只需遍历所有项目,然后检查 ID。

for(unsigned long i = 0; i < nItemCount; i++)
    if (Items[i].nID == 1)
        std::cout << "Found an item with id=1 with name: " << Items[i].Name << "\n";

编辑:如果你想使用class关键字,这就是你定义Item类的方式:

class Item
{
    public:
        unsigned int nID;
        char Name[64];
        char Desc[128];
}

如果您将我提供的struct Item代码中的声明替换为这个声明,则根本不会发生任何变化。


注意:对不起,我不熟悉 C++ 字符串处理,所以我使用 C 库<string.h>制作它。

注意:如果你想让一个Item存储更多的信息,比如DamageAttributes等,你可能希望以二进制方式读取和写入这些项目,这样它更容易和更紧凑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM