子串的out_of_range错误背后的未知原因

时间:2013-04-08 01:36:49

标签: c++

更新:是的,已经回答并解决了。然后我还设法找到输出的问题,这是我遇到的真正问题。我原以为子串错误就在它背后,但我错了,因为当修复它时,输出问题仍然存在。我发现在计算中这是一个简单的混淆。我一直在减去726而不是762.我可以在几小时前完成这件事...... Lulz。这就是我所能说的...... Lulz。

我正在自学C ++(使用他们网站上的教程)。当我需要做一些我不能用迄今为止学到的东西时,我不时跳起来。另外,我写得比较快。因此,如果我的代码看起来不优雅或在专业级别上无法接受,请暂时为此辩解。我目前唯一的目的是回答这个问题。

该程序获取我拥有的文本文件的每一行。请注意,文本文件的行如下所示:

.123.456.789

它有366行。我第一次写这个程序来处理这个问题让我手动输入每一行的三个数字。我相信你可以想象,这是非常低效的。该程序的目的是从文本文件中取出每个数字并执行功能并将结果输出到另一个文本文件。它每行执行此操作,直到它到达文件末尾。

我已经阅读了更多关于可能导致此错误的内容,但在我的案例中我无法找到原因。以下是我认为包含问题原因的代码:

int main()
{
    double a;
    double b;
    double c;
    double d;
    double e;
    string search; //The string for lines fetched from the text file
    string conversion;
    string searcha; //Characters 1-3 of search are inserted to this string.
    string searchb; //Characters 5-7 of search are inserted to this string.
    string searchc; //Characters 9-11 of search are inserted to this string.
    string subsearch; //Used with the substring to fetch individual characters.
    string empty;

    fstream convfil;
    convfil.open("/home/user/Documents/MPrograms/filename.txt", ios::in);
    if (convfil.is_open())
    {
        while (convfil.good())
        {
            getline(convfil,search); //Fetch line from text file
            searcha = empty;
            searchb = empty;
            searchc = empty;

            /*From here to the end seems to be the problem.
              I provided code from the beginning of the program
              to make sure that if I were erring earlier in the code,
              someone would be able to catch that.*/

            for (int i=1; i<4; ++i)
            {
                subsearch = search.substr(i,1);
                searcha.insert(searcha.length(),subsearch);
                a = atof(searcha.c_str());
            }
            for (int i=5; i<8; ++i)
            {
                subsearch = search.substr(i,1);
                searchb.insert(searchb.length(),subsearch);
                b = atof(searchb.c_str());
            }
            for (int i=9; i<search.length(); ++i)
            {
                subsearch = search.substr(i,1);
                searchc.insert(searchc.length(),subsearch);
                c = atof(searchc.c_str());
            }

我经常教自己如何通过查看其他人可能有的参考和问题来解决这些问题,但在这种情况下我找不到任何帮助我的东西。我已经尝试了很多变化,但由于问题与子字符串有关,我无法摆脱任何这些变体中的子字符串,所有都返回相同的错误和输出文件中的相同结果。 / p>

2 个答案:

答案 0 :(得分:0)

这是一个问题:

    while (convfil.good()) {
        getline(convfil,search); //Fetch line from text file

在执行可能失败的操作之前测试失败。当getline失败时,您已经在循环中。

因此,您的代码会尝试在最后处理无效记录。

而是尝试

    while (getline(convfil,search)) {   //Fetch line from text file

甚至

    while (getline(convfil,search) && search.length() > 9) {

如果文件末尾有一个空行,它也会毫无错误地停止。

答案 1 :(得分:0)

您可能正在读取文件末尾的空行并尝试处理它。

在处理空字符串之前测试它。