ifstream不在两行后从文本文件中读取

时间:2012-09-21 10:25:31

标签: c++ console fstream

我正在努力解决这部分代码,无论我尝试什么我都不能让它在两行之后读入记录

文本文件包含

Mickey Mouse 
12121
Goofy
24680
Andy Capp
01928
Quasi Modo
00041
end

,代码是

#include<iostream>
#include<string.h>
#include <stdio.h>
#include <windows.h>
#include<iomanip>
#include<conio.h>
#include<fstream>
#include<string>
using namespace std;

struct record          
{               
char name[20];
int number;
 };



void main()
{


record credentials[30];
    int row=0; 
fstream textfile;//fstream variable
textfile.open("credentials.txt",ios::in);
textfile.getline (credentials[row].name,30);
//begin reading from test file, untill it reads end
while(0!=strcmp(credentials[row].name,"end"))
{ 

    textfile>>credentials[row].number;

    row++;
    //read next name ....if its "end" loop will stop
    textfile.getline (credentials[row].name,30);
}
textfile.close();

}

记录仅占前两行,其余为空 任何想法??

1 个答案:

答案 0 :(得分:5)

问题在于:

textfile>>credentials[row].number;

虽然不使用换行符。随后对textfile.getline()的调用会读取一个空白行,然后是下一行:

textfile>>credentials[row].number;

尝试将"Goofy"读入失败的int并设置textfile流的失败位,这意味着所有进一步尝试读取失败。检查返回值以检测故障:

if (textfile >> credentials[row].number)
{
    // Success.
}

我不完全确定程序是如何结束的,因为"end"永远不会被读取但我怀疑它会异常结束,因为没有机制可以防止超出credentials数组的末尾(即没有{ {1}}作为循环终止条件的一部分。)


其他:

  • 您可以使用std::getline()代替使用固定大小的row < 30来读取姓名:

    char[]
  • 您可以使用std::vector<record>而不是使用固定大小的#include <string> struct record { std::string name; int number; }; if (std::getline(textfile, credentials[row].name)) { } ,而{{3}}会根据需要增长。