我正在为我的课程编写程序。我们正在制作一个抽象的数据类型。这意味着一个.cpp文件是一种抽象的数据类型,理论上它将被“插入”更大的程序中。另一个.cpp文件是我们的“测试客户端”,用于测试ADT编写的功能。测试客户端不能直接访问ADT的数据结构。
测试客户端可以使用静态数组来提供信息。但是ADT不能。如果需要存储测试客户端给出的数组,则需要分配一个动态数组并进行深拷贝。
我的问题是,在ADT中,我需要从内容不同的外部文本文件中读取字符,因此我需要将其读取到动态数组中。通常,我可以使用传递给函数的数组的strlen,然后分配该大小的新数组。但是在这种情况下,我不知道如何找到动态数组的大小。
外部文件由一首歌曲组成,其中的字段始终按此顺序排列:
artist name|album|keyWord|description\n
我需要将歌曲的各个部分放入一个动态数组中,但是我现在知道如何找到正确的大小。
我正在使用fstream读取和读取外部文件。
[如果有人可以引导我找到正确的解决方案,甚至只是伪代码,我也将非常感激。
编辑:我忘了提到我们不能使用字符串,向量或类似的东西。 ADT只能使用动态分配的字符数组。
我的歌曲班是:
class Song {
char *artist;
char *title;
char *album;
char *keyWord;
char *description;
};
构造函数将所有这些都设置为NULL。文本文件的每个字段都需要进入此类。
以二进制文件形式打开文件,并使用std :: ios:ate在文件末尾启动位置标记。然后,对ifstream.tellg()的首次调用将在最后一个字符之后立即报告索引。这意味着,即文件中的字符总数(因为第一个字符为索引0)。然后使用ifstream.seekg(0)将位置标记放回开头...设置动态数组的大小..然后一次向其中读取一个字符,直到文件结尾。然后,您可以解析成几行...,也可以在进行测试时测试换行符,并为每行创建动态数组...等等...
std::ifstream inFile{"filename.txt", std::ios::in|std::ios::binary|std::ios::ate};
if(inFile.is_open())
{
size_t length = inFile.tellg();
inFile.seekg(0);
// set buffer size
// read in chars from file until eof
}