c ++,将文本从大小未知的外部文件读取到数组中

问题描述 投票:-1回答:1

我正在为我的课程编写程序。我们正在制作一个抽象的数据类型。这意味着一个.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。文本文件的每个字段都需要进入此类。

c++ arrays dynamic-arrays abstract-data-type
1个回答
0
投票

以二进制文件形式打开文件,并使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.