我正在努力解决这部分代码,无论我尝试什么我都不能让它在两行之后读入记录
文本文件包含
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();
}
记录仅占前两行,其余为空 任何想法??
答案 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}}会根据需要增长。