2013-04-24 65 views
0

该块给我在内存位置0x0013f59c处的错误消息std :: out_of_range。 问题来自3条中间线(我放了星号)。代码在完美工作之前。我还亲自检查了每行都包含正确的前6个字符。std :: out_of_range在内存位置

if (openfile.is_open() && newfile.is_open()) 
{ 
     while (! openfile.eof()) 
    { 
        getline(openfile, originaldata); 
        string day(originaldata,6,2);   * 
        string month(originaldata,4,2);    * 
        string year(originaldata,0,4);    * 
        string data=day+"/"+month+"/"+year; 
    } 
} 
+0

那么你的文件中有什么?当引发异常时,originaldata的值是多少? – john 2013-04-24 15:26:07

+0

为了防止这些错误,您应该在提供有关它的详细信息之前验证'originaldata'。这被称为*鲁棒性*。 – 2013-04-24 19:31:31

回答

4

试试这个

if (openfile.is_open() && newfile.is_open()) 
{ 
    while (getline(openfile, originaldata)) 
    { 
        string day(originaldata,6,2); 
        string month(originaldata,4,2); 
        string year(originaldata,0,4); 
        string data=day+"/"+month+"/"+year; 
    } 
} 

使用EOF几乎总是错误的,因为EOF告诉你为什么最后读取失败,它不会告诉你,下一个读取失败。所以如果你打算使用它,那么在getline之前不要使用它。

+1

它告诉你上次读取是否涉及试图提取文件结束。不一定是失败。 – 2013-04-24 15:33:04

+0

我仍然有这个问题 – alwaystudent 2013-04-25 12:31:36

+0

好的,当你得到异常时,originaldata的值是多少?它是空白线还是像Drew Dormann所建议的那样太短?最初我曾问过这个问题,这是帮助你理解问题的基本信息。 – john 2013-04-25 12:36:31

2

您的输入文件可能包含一个空行,其中getline将读取,产生一个空字符串。

或者格式不正确的行太短。

考虑使用这个。

while (getline(openfile, originaldata) && originaldata.length() > 8) 

while将让你的代码使用getline作为条件,如果任何失败位在openfile集优雅地失败。不只是EOF。

+0

代码不断给出相同的错误 – alwaystudent 2013-04-25 12:29:44

相关问题