-1

我的任务是创建一个小程序来解析文本文件并从中获取必要的信息。该文件的布局是这样的

Tuesday*Info5051*10:00*11:00*M3039*Info5064*12:00*3:00*G1001;

基本上它应该将每个字符串存储在一个结构中,以便我以后可以检索它,但我无法让我的程序工作(我有学习障碍,所以事情往往会变得困难)。到目前为止,这是我的代码。(我知道这是一个简单的程序,但我倾向于过度思考/搞砸东西。)到目前为止,我遇到的最大问题是它不会打开文件来启动。我已将文件保存到 bin->debug 以及程序的主文件夹中。我确定我使用错误的 getline 方法。

struct Course
{
    string _sDay;
    string _sName;
    string _sCode;
    string _iStart;
    string _iDuration;
    string _sRoom;
};

int main()
{
    ifstream fileIn;
    fileIn.open("courseLoad.txt");

    vector<Course> vCourse;
    string str="*";
    string line;

    if (!fileIn)
    {
        cout<<"A error has occured, please contact support.";
    }

    while(!fileIn.eof())
    {
        for(int i=0; i!= fileIn.eof();i++)
        {
            //file.getline(entry.part_num, 6, '-');
            getline(fileIn,line,'*');
            vCourse[i]._sDay =line;
            getline(fileIn,line,'*');
            vCourse[i]._sName =line;
            getline(fileIn,line,'*');
            vCourse[i]._sCode = line;
            getline(fileIn,line,'*');
            vCourse[i]._iStart =line;
            getline(fileIn,line,'*');
            vCourse[i]._iDuration = line;
            getline(fileIn,line,'*');
            vCourse[i]._sRoom =line;

            cout<<vCourse[i];
        }//end for
    }
--output to screen here--
4

3 回答 3

2

这段代码有几个问题:

1) 该代码缺少 return 语句或 else 语句,以防止程序在无法打开文件的情况下继续执行:

if (!fileIn)
{
    cout<<"A error has occured, please contact support.";
    return -1;
}

2)您的 getline 都在相同的输入流上运行。您想读一行,然后解析该行。例如:

// Read in a line
while (getline(fileIn,line))
{
    string item;
    std::stringstream sstr(line);

    // Read in an item
    while (getline(sstr, item, "*"))
    {
        std::cout << item << std::endl;
    }
}

3) vCourse size为0,所以不能使用[]操作符;但是您可以使用 push_back 来扩大向量的大小并在向量的后面插入一个元素:

// Read in a line
while (getline(fileIn,line))
{
    string item;

    // Default course construction
    Course c;

    std::stringstream sstr(line);

    // Read in an item
    getline(sstr,item,'*');
    c._sDay = item;
    getline(sstr,item,'*');
    c._sName = item;
    getline(sstr,item,'*');
    c._sCode = item;
    getline(sstr,item,'*');
    c._iStart = item;
    getline(sstr,item,'*');
    c._iDuration = item;
    getline(sstr,item,'*');
    c._sRoom = item;

    // Save the course into the vector
    vCourse.push_back(c);
}

您还可以在上面添加更多错误检查(以防某些元素从行中丢失)。

于 2012-07-04T19:34:36.867 回答
0

一个显而易见的直接问题是,您实际上并没有将任何Course结构添加到向量中,而是像分配给它们的元素一样。例如

    vCourse[i]._sDay =line;

但是您实际上并没有Course在索引 i 处将结构的实例添加到向量中。这意味着您分配给一个不存在且绝不是好消息的实例。在此之前您需要的是

    Course newItem;             // make a new Course object instance
    vCourse.push_back(newItem); // This adds the instance to the end of the vector

    // Now assign to the members of vCourse[i];
    vCourse[i]._sDay =line;
    getline(fileIn,line,'*');
    vCourse[i]._sName =line;
    getline(fileIn,line,'*');
    vCourse[i]._sCode = line;
    getline(fileIn,line,'*');
    vCourse[i]._iStart =line;
    getline(fileIn,line,'*');
    vCourse[i]._iDuration = line;
    getline(fileIn,line,'*');

然后你可以分配给结构。

另外,如果您想这样做

    cout<<vCourse[i];

你需要超载operator<<

如果您无法打开您的文件,您需要检查您是否 1) 正确拼写了文件名,以及 2) 该文件与您的可执行文件位于同一位置。无论如何写完整的路径名可能会更安全

于 2012-07-04T19:16:26.370 回答
0

您也可以尝试将文件内容放入单个字符串并使用strtok() 函数

于 2012-07-04T19:24:12.923 回答