0

更新:是的,已回答并已解决。然后我还设法找到了我遇到的真正问题的输出问题。我曾以为子字符串错误是其背后的原因,但我错了,因为当它被修复后,输出问题仍然存在。我发现这是计算中的简单混淆。我一直在减去 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());
            }

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

4

2 回答 2

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) {

如果文件末尾有空行,它也会停止而不会出错。

于 2013-04-08T01:40:37.587 回答
0

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

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

于 2013-04-08T01:42:31.987 回答