C++ 从大小未知的文件创建字符串数组

C++ 从大小未知的文件创建字符串数组,c++,arrays,file,codeblocks,C++,Arrays,File,Codeblocks,您需要编写一个程序来管理学生的课程列表,并满足以下要求: 将课程数据存储在包含以下信息的文件中:课程名称、课程ID、会议日期和时间以及建筑。房间,老师。 (例如,计算机科学I、CSC201、周一、周三、9:00、10:40、在线、Zoom、S.Davis) 该文件的结构应为每门课程单独一行,每个数据项用逗号分隔 其中一个要求是:课程列表应该存储在一个数组中。(从文件开头读取,然后保存到文件结尾。) 它不工作,它显示文件的最后一行3次。我假设是3次,因为我的文件中有3行。我们不能使用向量,它必须是

您需要编写一个程序来管理学生的课程列表,并满足以下要求: 将课程数据存储在包含以下信息的文件中:课程名称、课程ID、会议日期和时间以及建筑。房间,老师。 (例如,计算机科学I、CSC201、周一、周三、9:00、10:40、在线、Zoom、S.Davis) 该文件的结构应为每门课程单独一行,每个数据项用逗号分隔

其中一个要求是:课程列表应该存储在一个数组中。(从文件开头读取,然后保存到文件结尾。)

它不工作,它显示文件的最后一行3次。我假设是3次,因为我的文件中有3行。我们不能使用向量,它必须是一个数组 这就是我所拥有的:


    void courseDisplay(ifstream& inData)
    {
      int x=0; //counter for lines in the file
      string str;
    
        while(getline(inData,str))  // counting number of lines in the file
          x++;
     std::string crs[x]; // declaring an array with x number of elements
        do
        {
        for (int i=0;i<x;i++)
          {
            inData>> str;
            crs[i]=str;
            std::cout<<crs[i]<<endl;
          }
       }while (getline(inData,str));
     cout<<endl;
    }


无效课程显示(ifstream和inData)
{
int x=0;//文件中行的计数器
字符串str;
while(getline(inData,str))//计算文件中的行数
x++;
std::string crs[x];//声明元素数为x的数组
做
{
对于(int i=0;i>str;
crs[i]=str;
std::coutIn

您可以数到文件末尾。您无法再从文件中读取。
str
包含最后一行

失败(因为您位于文件末尾,无法再读取文件)。
str
仍包含最后一行(从计数循环中)。重要的是要知道,
inData>>str;
只读取一个单词,而不是整行。它将
计算机科学I
分为三个元素
计算机
科学
I

线路

inData >> str;
crs[i] = str;
crs
的每个元素设置为最后一行。使用

std::cout << crs[i] << '\n';

std::cout
std::string crs[x];
是一个VLA(在标准C++中无效)…使用
std::vector crs;
crs.push_back
来代替。a会告诉您创建一个
std::vector crs;
并使用
crs.push_back(str)
添加新元素。除了VLA问题之外,在while循环读取所有行之后,您希望如何从文件中读取更多内容?没有任何内容可以读取。不仅如此,第一个循环计数行,第二个循环读取以空格分隔的字符串——只有在任何行上没有空格时才有效,除了换行符。在阅读每一行时使用
std::vector
std::deque
push_back
。关于您的注释“它必须是一个数组”,您显然需要了解动态内存分配,或者有一个关于输入最大大小的规范。可能是前者。在这种情况下,只需在必要时将数组大小增加一倍,并将元素从旧数组复制到新数组,然后删除旧数组。老实说,如果您的分配规定“不能使用向量",那么我肯定会使用一个
deque
。不管怎样,它更有效。如果他们因为你的批判性思维而惩罚你,他们首先就没有权利制定程序规范。老实说,我们还没有学会动态执行任何操作。只是简单的一个多维数组。谢谢你解释w为什么我得到了我想要的结果getting@leldaizy您了解了可变长度数组吗?如果您想在容器中存储未知数量的元素,您需要元素数量的上限或具有动态大小的容器。因此,x不能是上限?它必须是全局常量?将其分为两个不同的t函数,(第一个函数将返回x)也不会有帮助,对吗?如果问题很糟糕,我很抱歉,我只是想understand@leldaizy如果您不知道动态内存分配,并且不能使用STL容器,那么您需要在编译时设置一个上限(在读取文件之前)。要使用
x
作为上限,您需要一个具有动态大小的容器。
crs[i] = str;
std::cout << crs[i] << '\n';