无法从文件中读取项目(C ++)

时间:2015-11-29 03:57:14

标签: c++ fstream getline

因此,我在获取文本文件中的最后一项时无法读入字符串对象。

我创建了一个名为" Car,"我应该拥有" Car"的所有参数。对象从文件读入,但它不会注册最后一个。

ifstream对象是"数据"

变量是:

string carType;
string reportingMark;
int carNumber;
string kind;
bool loaded;
string destination;

文本文件中的行显示为:

  

汽车CN 819481维修无错

这就是我现在所拥有的:

getline(data, ignore); // ignores the header line
data >> carType >> reportingMark >> carNumber >> kind >> loaded;
while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here)
   data.get();
getline(data, destination);

因此,除了"目的地"之外,它将读取所有内容。一部分。

5 个答案:

答案 0 :(得分:0)

代码似乎是正确的;除了我没有看到需要把

  

while(data.peek()=='')   data.get();

     

getline(数据,目的地);

部分阅读目的地。相反,您可以简单地将其读作数据>>目的地。 此外,通过检查

确保您的输入文件正确打开
  

if(data.isOpen()){// cout something}

我希望这有帮助! :)

答案 1 :(得分:0)

检查所有IO操作的返回值总是好的。如果添加错误检查,您可能能够找到问题并找到解决方案。

if (!getline(data, ignore)) // ignores the header line
{
   std::cerr << "Unable to read the header\n";
   exit(EXIT_FAILURE);
}

if ( !(data >> carType >> reportingMark >> carNumber >> kind >> loaded))
{
   std::cerr << "Unable to read the data\n";
   exit(EXIT_FAILURE);
}

while (data.peek() == ' ') // this and the next lines were the suggestions of the teacher to bypass the spaces (of which there are more than it will display here)
   data.get();

if ( !getline(data, destination) )
{
   std::cerr << "Unable to read the rest of the line\n";
   exit(EXIT_FAILURE);
}

答案 2 :(得分:0)

如何给你的&#34; ifstream&#34;对象,像这样

    ifstream ifstreamObject;
        ifstreamObject.open("car.txt");


cout << "carType"<< ' '<< "reportingMark" << ' '<< "carNumber" <<' '<< "kind" <<' '<< "loaded"<<' '<<"destination"<< endl;
           while(ifstreamObject >> carType >> reportingMark >> carNumber >> kind >> loaded >> destination )
           {       cout <<"---------------------------------------------------------------------------"<<endl;
                   cout << carType<< ' '<< reportingMark << ' '<< carNumber <<' '<< kind <<' '<< loaded<<' '<<destination<< endl;
           }

答案 3 :(得分:0)

问题在于这一部分:

data >> carType >> reportingMark >> carNumber >> kind >> loaded;

在这里,您尝试从流中reed一个布尔变量loaded。您希望阅读false能够奏效,但事实并非如此。它仅接受01

相反,如果未能读取布尔变量,则会切换流的err位,从而在读取之后读取其他所有内容。

要检查一下,如果您在该行之后立即data.peek(),您将收到-1,表示无效输入。

要解决此问题,您需要更改存储信息的方式,以便存储0/1而不是true/false,或者更好:

在阅读数据之前执行:data << boolalpha。这会使流将true/false解释为0/1

答案 4 :(得分:0)

如果我是你,我会尝试用strtok函数读取文件。

如果您愿意,可以阅读此内容以获取更多信息strtok function

我最近完成了这项任务,并且我使用了strtok,因为它允许将文件的每一行拆分成一个单词列表。此外,它允许您避免分配像空格等标点符号。(所以我发现它非常有用)

我的例子:我想从文件中读取一些角色数据,例如种族,职业,生命值,攻击和防御。

我文件的每一行都是这样的:Human / soldier / 15/7/7

因此,我定义了一个char指针,用于存储strtok函数的返回值和一个存储读取字的char指针,直到找到您之前考虑过的分隔符。 (在此示例中:'/')

char* position = strtok(file, '/');
char* character_info = new char[size];

因此,您将该行存储在character_info中,并在每次迭代时检查位置值,直到您读完该文件为止。

while(position != NULL){
  // store position value
  // call again strtok
}

我希望它会有所帮助! =)

干杯