我如何显示没有其他值的数组? C ++

时间:2018-11-20 08:33:25

标签: c++ arrays file-io char

因此,我将数组值设置为100,当我想显示数组时,也将显示其他没有值的数组。有什么方法可以删除它?谢谢!

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<fstream>  
#include<limits>
#include<sstream>
using namespace std;

char add();
char list();


struct Book //structure for the book
{
char title[50];
char author[50];
int price;
void display() {
    cout << "Name:" << title << endl
        << "Author:" << author<< endl
        << "Price:" << price << endl << endl;
}

};
Book book[100];

void main()
{

int selection;


do {
cout << "Activity Selection: " << endl;
cout << "1.  Add book" << endl;
cout << "2.  List all books" << endl;
cout << "3.  Search book" << endl;
cout << "4.  Check total book purchased and total spent" << endl;
cout << "5.  Quit" << endl;
cout << "Please enter your selection(1/2/3/4/5): ";
cin >> selection;
cin.ignore();


    switch (selection)
    {

    case 1:
        add();
        break;
    case 2:
        list();
        break;
    case 3:
        cout << "number 3" << endl;
        break;
    case 4:
        cout << "number 4" << endl;
        break;
    default:
        exit(1);
        break;
    }
    } while (selection <= 4);



system("pause");
}

char add()
{
int i;


ofstream outFile;
outFile.open("Records.dat", ios::app);
if (!outFile.is_open())
{
    cout << "Can’t open file.";
    system("pause");
    exit(1);
}


cout << "Please enter the book title:";
cin.getline(book[i].title, 51);
cout << "Please enter the author name of the book:";
cin.getline(book[i].author, 51);
cout << "Please enter the price of the book RM: ";
cin >> book[i].price;
cout << "\nThe book\""<< book[i].title <<"\"has been added to the system.\n" << 
endl;
outFile << book[i].title << "," << book[i].author << "," << book[i].price << 
endl;
outFile.close();



}

char list() //second solution but still doesnt work need some fixing here i think
{
int i;
string line, token;
ifstream inFile;
inFile.open("Records.dat", ios::in);
if (!inFile.is_open())
{
    cout << "File could not open" << endl;
    system("pause");
    exit(1);
}
char data;
while (getline(inFile,line))
{

    inFile.get(data);
    if (!(data == 0));
    cout << data;
}
cout << endl;
inFile.close();
}

当我调试类似的东西时出来: ss

这是我提出的第二个解决方案,但仍然无法解决问题

 char list()
{
int i , count = 0;
string line, token;
ifstream inFile;
inFile.open("Records.dat", ios::in);
if (!inFile.is_open())
{
    cout << "File could not open" << endl;
    system("pause");
    exit(1);
}
char data;
while (getline(inFile, line))
{

    stringstream ss(line);
    getline(ss, token, ',');
    stringstream(token) >> book[i].title;
    getline(ss, token, ',');
    stringstream(token) >> book[i].author;
    getline(ss, token, ',');
    stringstream(token) >> book[i].price;
    i++;

}
cout << endl;
inFile.close();
for (int count = 0; count < i; count++)
    book[i].display();


}

问题是我真的不知道如何使用dat文件显示数组,但我成功显示了它,但是出现了错误

1 个答案:

答案 0 :(得分:0)

您正在将CSV作为文本文件读取并仅打印它。 因此,解决方案是创建一个记录类,从流中读取它,然后检查它是否为空。

#include <iostream>
#include <sstream>
using namespace std;

class Record {
private:
    std::string title;
    std::string shortTitle;
    int number;
public:
    Record(std::string title, std::string shortTitle, int number): title(title),
                                                         shortTitle(shortTitle),
                                                                 number(number){

    }
    inline std::string getTitle() const { return title; }
    inline std::string getShortTitle() const { return shortTitle; }
    inline int getNumber() const { return number; }
};

// Make this function capable of handling any stream by making it template
// (anything that could be passed to a `getline` as a first parameter and have
//  an operator >> overloaded that accepts an integer)
template<typename Stream>
Record readFromStream(Stream &str) {
    std::string title;
    std::string shortTitle;
    int number;
    std::string line;
    // Read a line from the stream
    getline(str, line);
    // Make a new stream from that line
    std::stringstream lineStream(line);
    // Read until the comma
    getline(lineStream, title, ',');
    getline(lineStream, shortTitle, ',');
    // The last one is an integer, simply read it
    lineStream >> number;
    return Record(title, shortTitle, number);
}

int main() {
    Record rec = readFromStream(cin);
    // Check for emptiness, if is NOT empty write it
    if (rec.getTitle().size() && rec.getShortTitle().size()) {
        cout << rec.getTitle() << "\n";
        cout << rec.getShortTitle() << "\n";
        cout << rec.getNumber() << "\n";
    }
    return 0;
}