【问题标题】:Store strings from a file, but array is still empty? Loop for array size存储文件中的字符串,但数组仍然为空?循环数组大小
【发布时间】:2019-03-14 00:45:40
【问题描述】:

基本上,我不确定为什么会发生这种情况,但我真的很想弄清楚。这是我的一个想法,我正在努力让它发挥作用。

所以我要做的是:基本上从文件中读取字符串并将它们存储到数组中。

但是,我想这样做:

我不想为某个给定的常数初始化数组的大小,而是希望有一个循环,它首先读取文件中的行数并将该值分配给一个变量。因此,该值将是数组的大小,因为该值将对应于我要存储在数组中的元素数量。 我希望文件中的每一行文本,所以对于每个字符串,都是数组的一个元素。

代码如下:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main() {


ifstream the_file;

int i, j, z;

string lineCount;

the_file.open("sentence.txt");

j = 0;

while(!the_file.eof())

{
    getline(the_file, lineCount);
    j++;
}

z = j;


string array[z];


for (i = 0; i < z; i++)  {

    getline(the_file, array[i]);                       // Array is empty
    cout <<  i << " " << array[i] << endl;
}

cout << z << endl;



return 0;

}

所以在得到这个数字之后,我接下来想将元素实际存储在数组中。 对于这一部分,我使用了一个 for 循环进行尝试,并让循环执行 (array size - 1) 次数以对应于存储在数组的一个索引中的每个元素。

我只是不明白为什么,运行它后,它显示数组是空的。它表明数组的大小与文件中的行数相对应,但在任何内存空间中似乎都没有任何元素。

问题是,我尝试简单地将数组设置为给定的常量大小。所以基本上只是简单地从文件中读取元素并将它们存储在数组中,而无需执行第一个循环来确定设置数组的大小。在这种情况下,它可以正常工作,并且所有元素都可以正常存储,并且没有一个内存空间是空的。

但是为什么如果我想做一个循环以使值与我希望数组的大小相对应,然后尝试存储这些元素,就好像文件没有被读取正确了,分配的内存空间是空的?

这是输出:

    /Users/macuser/CLionProjects/PA2supp/cmake-build-debug/PA2supp
0 
1 
2 
3 
4 
5

Process finished with exit code 0

这是我要阅读的文件,这是“sentence.txt”。就像我说的,我希望每一行都成为我数组中的一个元素

This is just one sentence.
This is the second sentence.
This is the third sentence.
This is the fourth sentence.
Fifth sentence right here.

请不要建议使用向量,虽然我知道向量的一些好处,但我真的很想使用数组来做这个特定的事情。

【问题讨论】:

  • 你的第一个while 循环会消耗整个文件(while(!f.eof()) 的问题除外),那么你怎么能指望从头开始阅读呢?
  • 总是测试诸如调用getline之类的东西,以确保它正确读取

标签: c++ arrays for-loop while-loop fstream


【解决方案1】:

显示的代码中有多个错误。

string array[z];

可变长度数组不是标准 C++,您在这里使用的是非标准 C++。要么使用new,创建一个可变大小的数组,要么使用std::vector

while(!the_file.eof())

这是a common bug。您最终的行数将是错误的。阅读此链接,了解为什么这会导致错误的行数。

然后,在while 循环结束时,您已到达文件末尾。

当您开始第二个循环时,您仍处于文件末尾。您的第二个循环 for 循环从文件流开始,仍然位于文件末尾,因此第二个循环不会读取任何内容。已读取整个文件。在for 循环的每次迭代中,getline() 不会读取任何内容,因为在第一个while 循环中已经读取了整个文件。

请记住计算机编程的黄金法则:计算机将始终完全按照您的要求执行操作,而不是您希望它执行的操作。在这里,您希望第二个循环从头开始读取文件,但您还没有告诉您的计算机这是它应该做的。在再次读取之前,您需要 use seekg() to reposition the input stream 到文件的开头,并且,为了更好地衡量,clear() 文件状态(因为文件流将设置文件结束和/或失败位, 作为在第一个循环中到达文件末尾的结果)。

【讨论】:

    【解决方案2】:

    好的,非常感谢您的意见。

    我解决了它,我使用 .close() 函数关闭了文件,然后再次打开它,它完成了我的目标。这很简单,但一开始我就走了,我发现我错过了使用第一个循环时我在文件末尾的事实!再次感谢您添加的内容,这很有帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-02
      • 2012-08-16
      • 2020-07-15
      • 2022-06-13
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2011-09-23
      相关资源
      最近更新 更多