[英]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
存储更多的信息,比如Damage
, Attributes
等,你可能希望以二进制方式读取和写入这些项目,这样它更容易和更紧凑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.