提问者:小点点

有两个getline时Cout为空?


我正在尝试释放我的数组,但它总是显示空的每当我尝试。

int array_size = 0;
int pos;
string line;

ifstream inFile;
string filename = 'test.txt';
inFile.open(filename);

for(array_size = 0; getline(inFile, line); array_length++);

string * array_holder = new string[array_size];

while(getline(inFile, line))
{
    array_holder[pos++] = line;
}

printArray(array_holder, array_size);

打印数组

void printArray(string * data, int x)
{
    for(int z = 0; z < x; z++)
        cout << data[z] << endl;
}

当我注释掉这一行时:

for(array_size = 0; getline(inFile, line); array_length++);

printArray将显示里面的所有内容。

但是当我取消对该行的注释时,它只显示空行(取决于数组大小)。

我想这是由于双重getline? 我需要清除getline缓冲区什么的吗? 我找不到任何有关getline缓冲区的详细信息,除了cin。 还是这是内存的问题?

注意,我不能在我的情况下使用vector,我需要读取文本文件中的总行数,以便将数组大小解析为我的数组语法。

谢了。


共1个答案

匿名用户

for(array_size = 0; getline(inFile, line); array_length++);

这个循环读取infile,每次一行,直到到达文件的末尾。

此循环终止后,整个文件已被读取。 毕竟,这正是您的程序告诉您的计算机要做的:每次读取一行,递增计数器,直到getline失败,这发生在文件的末尾。 但紧接着,第二个循环尝试继续从文件中读取:

while(getline(inFile, line))

但是,由于已经到达文件的末尾,这立即失败,什么也没有发生。

你显然想从头重读文件,这里。 然而,计算机编程的黄金法则指出:“你的计算机永远会完全按照你让它做的去做,而不是按照你想让它做的去做”。 您没有告诉您的计算机回到文件的开始在这里,所以它没有理由那样做。 因此,您只需通过关闭并重新打开文件或使用seeKG()方法来告诉计算机这样做。