【问题标题】:What could cause this error to create when using the array? Solution?使用数组时可能导致此错误的原因是什么?解决方案?
【发布时间】:2019-02-28 20:31:39
【问题描述】:

这里有点新,一直在尝试解决getline的问题。我发现错误的根源是由于 intext[18]。一旦我删除了数组,所有错误都会消失。问题是我拥有的文档有 19 行数据需要检索,因此我决定尝试将其全部放入数组中,而不是键入每个字符串。我对 c++ 很陌生,这是迄今为止我唯一一次碰壁。如果这个问题已经解决,我会提前道歉。我整天都在寻找没有解决。

#include "pch.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <array>

using namespace std;

int main()
{
    ifstream inFile;
    string intext[18];

    inFile.open("HW3_Data_W.txt");
    while (inFile.is_open()) {
        getline(inFile, intext);

        cout << "Data from the file:" << endl; 
        cout << "Item 1: " << intext << endl;

        break;

        inFile.close();
    }
}

【问题讨论】:

  • 由于break,您的循环总是一次结束。而如果你想使用一个数组,你需要指定,你想使用哪个索引(你有18个std::strings,你要使用哪个?),即cout &lt;&lt; "Item 1: " &lt;&lt; intext[0] &lt;&lt; endl;
  • string intext[18] 使 intext 成为 18 个 strings 的数组。在getline() 中,应为string。要么解决intext[18] 的一个元素,例如getline(inFile, intext[0]) 或者只是不要创建intext 和数组:string intext;。为什么要intext 成为一个数组?
  • 只想再添加一件事,你提到你有 19 个字符串,所以如果你要创建一个数组,那么声明 intext[19] 而不是 intext[18]。

标签: c++ arrays file-io getline


【解决方案1】:

您正在尝试将字符串值分配给字符串数组变量,您应该 getline(inFile, intext[i]); 其中i 是行数。

您的数组也只能包含 18 行文本,因为您是这样声明的。如果你想读取正好有 19 行的文件,你应该这样声明:

string intext[19];

如果您希望程序读取任意数量的行,您应该使用 std::vector。

除此之外,您的 while 循环只会重复一次。因为你无条件地打破它。我猜你想做的是这样的:

inFile.open("HW3_Data_W.txt");
int i = 1;
while (inFile.is_open()) {
    getline(inFile, intext[i]);
    i = i + 1;
    cout << "Data from the file:" << endl; 
    cout << "Item 1: " << intext << endl;

    if(inFile.eof) continue;

    inFile.close();
}

此代码应该可以工作,但过于复杂。您的 while 条件检查您的文件是否打开,但在您关闭它之前它将一直打开,并且您希望在到达文件末尾时关闭它。所以你的 while 条件看起来像这样: 而(getline(inFile,intext [i])) 如果 getline 到达文件的最后一行,它将返回可转换为 false 的值,因此您的 while 将一直持续到您读取 while 文件。你必须检查文件是否在你之前打开,然后你应该在一段时间后关闭文件。所以类似的东西:

inFile.open("HW3_Data_W.txt");
int i = 0;

if(!inFile.is_open())
    return EXIT_FAILURE;

while(getline(inFile, intext[i])) {
    cout << "Item "<<i<<": " << intext[i] << endl;
}

inFile.close()

【讨论】:

    【解决方案2】:

    这里有一些问题:

    1. 如果要读取 19 行,则字符串数组的大小至少应为 19。

    2. 检查文件是否仅成功打开一次。无需检查while 条件。

    3. 使用在 while 循环之前初始化为 0 的计数器读入 whileintext 数组的连续元素。在while 循环内增加此计数器。

    4. while 中删除break,因为您要读取整个文件。

    5. 不要在此期间关闭ifstream。在while 循环之后执行。

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 1970-01-01
      • 2023-03-24
      • 2011-11-18
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      相关资源
      最近更新 更多