所以我有一个读取文本文件的任务,该文件包含有关一个人的四条信息,这些信息以逗号分隔。我试图读入文件,称为" 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;
}
}
答案 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返回的字符串不是整数,因此您需要读取字符串并与字符串进行比较,或者读取整数。