C ++动态分配数组 - 在我的头脑中

时间:2014-04-16 02:26:17

标签: c++ dynamic-arrays

所以我有一个读取文本文件的任务,该文件包含有关一个人的四条信息,这些信息以逗号分隔。我试图读入文件,称为" lab8.txt",分解信息,然后允许用户查看信息以及能够修改信息。目前,我专注于从文本文件中获取信息,并能够向用户显示此信息。我在整个代码中有几个错误,并希望有人可以帮助我解决这些错误并告诉我我做错了什么。任何和所有的帮助表示赞赏。文本文件如下所示。对不起,我知道这有很多问题,但作业是由我的教授以外的人创造的,而我的班级比完成这项任务的教授班级要远得多。

  
    

M123456789,Smith,Joe,1978/12/30,M2345689,Jones,Marc,1980/01/28,     M000022,Bach,Johann,1685/03/31,M000024,Mozart,Wolfgang,1791/01/27,     M000023,Handel,George,1759/04/14,M222222,Geisel,Theodor,1904/03/02,     M000044,Sousa,Philip,1854/11/06,M000046,The Frog,Kermit,1955/05/09,     M000049,Piggy,Miss,1974/10/13,M000049,Piggy,Miss,1974/10/13,     M000043,汉森,詹姆斯1936/09/24

  

我的代码包括三部分。我的所有函数定义的主函数,头文件和cpp文件。我会按顺序列出它们。

//主要功能

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <cstdlib>
#include <classname.h>


using namespace std;

int main()
{
    File var1;
    var1.MenuEditor();
}

#ifndef CLASSNAME_H_INCLUDED
#define CLASSNAME_H_INCLUDED
#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

struct StudentData
{
    string StudentId;
    string LastName;
    string FirstName;
    string BirthDate;
};

// HEADER FILE

class File
{
    public:
        File();
        File(string);
        bool ReadRecordsFromFile(string);
        void MenuEditor();
        void SearchFile (string);
    private:
        int number_records;
        void BreakUp (string);
        void SortName (StudentData, string);
        StudentData allocate(string);
        void AddRecord(string);
        void DeleteRecord(string);
        void ModifyRecord(string);
        bool ReadRecordsFromFile(string fileName);
        void WriteRecordsToFile(string fileName);
};

#endif // CLASSNAME_H_INCLUDED

//具有功能定义的CPP文件

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
#include <cstdlib>
#include "classname.h"

using namespace std;
// This method returns a true if you can open the file or a false if you can
// not

// You will need to add calls to your methods to allocate the array and
// "breakup" the input string.
File::File(string fileName)
{

}

bool File::ReadRecordsFromFile(string fileName)
{
    string input_line;
    ifstream infile(fileName.c_str()); // This might be useful for you.

    if(!infile)
    {
        return false;
    }
    Records=new StudentData[100];

// number_of_records or some other variable to store current record count
    number_of_records = 0;
    while(getline(infile, input_line))
    {
// CHECK to see if you need to allocate or expand dynamic array here
//  - Use method defined in class to do the allocation
// Call Method to break up data stored in input_line
// and than store new data into dynamic array
//  - See Files++ code sample on blackboard

        string temp,MNum,
        int Current_comma= input_line.find(",");
        Records[number_of_records].StudentID = input_line.substr(0, Current_comma);
        temp= input_line.substr(Current_comma+1);
        cout << [number_of_records].StudentID <<endl;
        number_of_records = number_of_records + 1;
    }

    return true;
}

// This method returns a true if you can open the file for writing and
// false if not
bool Lab8::WriteRecordsToFile(string fileName)
{
    string output_line;
    ofstream outfile(fileName.c_str());

    if(!outfile)
    {
        return false;
    }

// number_of_records or some other variable to store current record count class
    for (int rec_count = 0; rec_count < number_of_records; rec_count++)
    {
// CREATE a seperate output line out of your data or create it inline
        fileobject << output_line << endl;
        number_of_records = number_of_records + 1;
    }
    outfile.close();

    return true;
}




File::StudentData allocate(string);
{

}


void File::AddRecord(string fileName)
{

}
void File::DeleteRecord(string fileName)
{

}

void File::ModifyRecord(string fileName)
{

}
void File::SortName(string fileName)
{

}
void File::SearchFile(string fileName)
{

}
void File::MenuEditor()
{
    ReadRecordsFromFile("lab8.txt")
    cout << "Press 1 to add file." <<endl;
    cout << "Press 2 to delete file." <<endl;
    cout << "Press 3 to modify file." <<endl;
    cout << "Press 4 to sort file." <<endl;
    cout << "Press 5 to search file." <<endl ;
    getline(cin,  int menuchoice);
    if (menuchoice == 1)
    {
        AddRecord();
    }
    else if(menuchoice == 2)
    {
        DeleteRecord();
    }
    else if(menuchoice == 3)
    {
        ModifyRecord();
    }
    else if(menuchoice == 4)
    {
        SearchFile();
    }
    else if(menuchoice == 5)
    {
        SortName();
    }
    else
    {
        cout << "You done messed up. Re run the program" << endl;
    }
}

2 个答案:

答案 0 :(得分:0)

#include <fstream>    
class File
{
    public:
        File();
        *****File(string);********  change to File(&ifstream) <--- do this when passing a text file to a function. 
        bool ReadRecordsFromFile(string);
        void MenuEditor();
        void SearchFile (string);
    private:
        int number_records;
        void BreakUp (string);
        void SortName (StudentData, string);
        StudentData allocate(string);
        void AddRecord(string);
        void DeleteRecord(string);
        void ModifyRecord(string);
        bool ReadRecordsFromFile(string fileName);
        void WriteRecordsToFile(string fileName);
};

答案 1 :(得分:0)

以下是一些提示:

StudentData结构需要在任何地方都可见。这应该在你的头文件中 - 它可能是,但它似乎不是你呈现它的方式。

您的File类中有两个ReadRecordsFromFile。你不能让其中两个使用相同的参数,而是一个私有和一个公共。删除其中一个。

你需要一个StudentData *记录;在你的File类中。这应该在构造函数中初始化为nullptr或零。

您的类定义了number_records,但您使用了一个名为number_of_records的东西。你需要保持一致。此外,这应该在构造函数中初始化为零。

您在StudentId中的大小写不一致。您确实需要在变量名称上保持精确和一致。

ReadRecordsFromFile中的cout输出没有说出你要写出的变量。大概你的意思是记录

WriteRecordsToFile的返回值在声明和定义

之间有所不同 在WriteRecordsToFile中,

fileobject是未声明的文件对象是什么意思?也许outfile ??

在allocate方法中的File ::是在错误的位置,并且在末尾有一个分号表示它是一个声明,而不是一个定义。

SortName的定义与其声明不匹配。

在你对getline的调用中,你尝试创建一个变量。你不能在内部参数中做到这一点。您需要先定义它。

getline返回的字符串不是整数,因此您需要读取字符串并与字符串进行比较,或者读取整数。