【问题标题】:How do I get an input file to read into a string array in C++?如何让输入文件读入 C++ 中的字符串数组?
【发布时间】:2016-11-30 20:18:52
【问题描述】:

由于某种原因,我的输入文件中的整行没有读入数组,只有每行中的第一个单词。我目前正在使用 getline 调用,但我不确定它为什么不起作用。这是我调用填充数组的内容。 txt 文件是歌曲列表。

const int numTracks = 25;
string tracks[numTracks];
int count = 0, results;
string track, END;

cout << "Reading SetList.txt into array" << endl;

ifstream inputFile;
inputFile.open("SetList.txt");
while (count < numTracks && inputFile >> tracks[count])
{
    count++;
    getline(inputFile, track);
}
inputFile.close();

【问题讨论】:

  • 你没有在循环中使用track

标签: c++ arrays file input getline


【解决方案1】:
while (count < numTracks && inputFile >> tracks[count])

&gt;&gt; 运算符读取一个单词。这段代码将这个单词读入相关向量中。

getline(inputFile, track);

没错,您使用的是getline()。将行的其余部分,在初始单词之后,读入一些不相关的变量tracktrack 似乎是一个非常无聊的 std::string,显然,它在循环的每次迭代中都会被覆盖,否则会被完全忽略。

【讨论】:

  • 无论如何要更改它,以便它读取整行。我尝试使用 track[count] 而不是 track,但每次都会导致程序灾难性失败。
  • 当然有,但是“灾难性故障”并不是一个有用的问题描述。
【解决方案2】:

您的循环正在使用operator&gt;&gt; 将文件读入数组。该操作员一次读取一个单词。您需要完全删除该运算符并使用std::getline() 填充数组,例如:

const int numTracks = 25;
std::string tracks[numTracks];
int count = 0;

std::cout << "Reading SetList.txt into array" << std::endl;

std::ifstream inputFile;
inputFile.open("SetList.txt");
while (count < numTracks)
{
    if (!std::getline(inputFile, tracks[count])) break;
    count++;
}
inputFile.close();

或者:

const int numTracks = 25;
std::string tracks[numTracks];
int count = 0;

std::cout << "Reading SetList.txt into array" << std::endl;

std::ifstream inputFile;
inputFile.open("SetList.txt");
while ((count < numTracks) && (std::getline(inputFile, tracks[count]))
{
    count++;
}
inputFile.close();

或者,考虑使用std::vector 代替固定数组,然后您可以使用std::istream_iteratorstd::back_inserter 完全摆脱手动循环:

class line : public std::string {}

std::istream& operator>>(std::istream &is, line &l)
{   
    return std::getline(is, l);
}

...

std::vector<std::string> tracks;

std::cout << "Reading SetList.txt into array" << std::endl;

std::ifstream inputFile;
inputFile.open("SetList.txt");

std::copy(
    std::istream_iterator<line>(inputFile),
    std::istream_iterator<line>(),
    std::back_inserter(tracks)
);

inputFile.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多