【问题标题】:reading in from file to an array C++从文件读入数组 C++
【发布时间】:2014-06-13 17:07:24
【问题描述】:

我一直在尝试执行从文件中读取一行文本并将其保存到数组中的相对简单的任务。不幸的是,这并没有起作用,相反,简单的程序根本没有读取任何内容。这是我尝试使用的代码:

ifstream in_stream;
int x=0;
string array[150]
in_stream.open("file.txt");

while(!in_stream.eof()){
    in_stream>>array[x];
    x++;
}

我也尝试过如下使用getline:

ifstream in_stream;
int x=0;
string array[150]
in_stream.open("file.txt");

while(!in_stream.eof()){
    getline(in_stream, array[x]);
    x++;
}

这两种模式都不起作用,不会将任何内容读入数组,而是将其留空... 我只是不确定出了什么问题,所以如果有人可以提供帮助,那就太好了!

【问题讨论】:

  • 附带说明,您应该使用std::vector 而不是数组。然后,您不必担心文件的大小。
  • 在两个示例中,string array[150] 后面都缺少分号。
  • 我不认为这会导致您遇到的问题,但在执行 in_stream>>array[x]; 之前检查 EOF;也不保证该操作会正常工作。你应该检查你是否真的成功读取了数据。

标签: c++ arrays file


【解决方案1】:

在尝试读取文件之前检查文件是否实际打开很重要,因为在您的情况下,如果文件无法打开,您将不会开始填充数组。

正如 christianm 所说,最好使用 std::vector,因为它可以让您处理任何大小的文件。因此,我的建议是重构您的代码如下:

std::ifstream in_stream("file.txt");

if(!in_stream.good())
{
    std::cerr << "Error opening file!" << std::endl;
    //More error handling code goes here
}

std::vector<std::string> lines;
while(!in_stream.eof())
{
    std::string line;
    std::getline(in_stream, line);
    lines.push_back(line);
}

std::cout << "Read: " << lines.size() << " lines." << std::endl;

关于 ifstream 需要记住的一点是,它将打开您传递给它的字符串作为测试用例中的相对路径。这意味着您必须从包含 file.txt 的同一目录启动程序,在程序启动后更改工作目录,或提供完全限定的路径。

【讨论】:

    【解决方案2】:

    看,这是我 file.txt 的内容:

    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    

    正好 10 行

    这就是存储在大小 == 20 的数组中的数据:

    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    ifojgoidfjjfdogdifjgdjgdoigjdoijdofi
    

    10 行!

    如果你使用getline,每一行都会被存储到数组中的一个位置。如果文件的大小不够大和/或数组的大小太大,则只会看到打印出的空格。首先,确保你的数组足够短或者你的文件足够大。无论如何,getline 的解决方案可以工作。我没有测试ifstream的解决方案,但是情况和第一个类似。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2021-01-03
      • 2018-06-20
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多