0

我正在为作业做的一些代码有问题。当我去编译文件时,它有时可以工作,有时不能。该程序的基本思想是从文件中读取每一行文本并将其存储到一个数组中(数组的大小应该是 100,应该有 100 行文本)。每个文本字符串(每一行)都应该存储在它自己的数组地址中。一旦存储了所有行,程序将从数组中拉出每一行,注意它来自哪个行号。当用 Code::Blocks 编译它时,它运行没有问题,但是,当我用 cygwin 编译它时,我去运行它并得到一条错误消息,上面写着“在抛出一个 'std::bad_cast' 实例后调用终止什么( ): std::bad_cast 中止(核心转储)"

你们能给我的任何帮助将不胜感激!

这是我到目前为止得到的代码:

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
string aFile[100];
ifstream nFile("TMA1Question4 Text.txt");
string nText;

    if (nFile)
    {
        for (int nLineCounter=1; nLineCounter <=100; getline(nFile, nText))
        {
            aFile [nLineCounter] = nText;
            nLineCounter++;
        }
    }

for (int nLineReader=1; nLineReader<=100; nLineReader++)
{
    cout << "Line" << nLineReader << ": " << aFile[nLineReader] << endl;
}

return 0;
}
4

2 回答 2

1

首先,数组从 0 开始索引。数组索引的范围是 0 到 99,而不是 1 到 100。你的for循环应该更像:

for (int nLineReader=0; nLineReader<100; nLineReader++)

您试图以for偷偷摸摸的方式使用循环也是一个问题。getline只会在每次迭代后调用。在第一次迭代中,您将空字符串粘贴nText到数组中。将其更改为:

for (int nLineCounter=0; nLineCounter<100; nLineCounter++)
{
    getline(nFile, nText);
    aFile [nLineCounter] = nText;
}

当然,这取决于您确定文件中有 100 行。从文件中读取行的更安全的方法是getline用作循环的条件:

int nLineCounter = 0;
while (getline(nFile, nText))
{
    aFile[nLineCounter] = nText;
    nLineCounter++;
}

但是,如果您要使用标准容器(您应该这样做),您可以从文件中读取行,而根本没有循环

于 2013-02-09T22:20:29.983 回答
0

C 和 C++ 中的索引是从零开始的,所以你的计数器从 0 开始,然后到 1 小于最大值


也就是说,考虑使用 astd::vector而不是原始数组。然后就可以使用的push_back方法了std::vector。这样您就可以更轻松地存储任意数量的行,而不仅仅是 100 行。


当前代码还存在一些其他问题,但是当您修复技术问题时,您可能会发现并修复所有这些问题……;-)

于 2013-02-09T22:19:23.900 回答