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