Читать данные из файла - PullRequest
0 голосов
/ 10 февраля 2019

Файл содержит данные в этой форме.

1#Ali Khan#Lahore#M#22#1#1#1997#1
2#Ahsan Latif#Karachi#M#19#21#5#1996#1
3#M Sultan#Lahore#M#15#15#1#1998#1
4#Sana Ali#Islamabad#F#19#3#4#1996#1

Где каждая строка представляет уникального пользователя в следующем порядке (Id, Name, City, Gender, Age, DoB).
Моей программе придется читать этот файл построчно и заполнять список пользователей.

void loadUsersfromFile( facebookUser * userlist, int & size);

facebookUser - это structuserlist - это массив

Я попытался использовать getline() и поместил строку в строковую переменную.Затем, используя substr, я извлекаю id, пол имени пользователя и т. Д.
Но проблема в том, что строку нельзя скопировать в массив типа facebookUser.Так что не работает.

#include <iostream>
#include <fstream>

using namespace std;

struct mDate {
    int day;
    int month;
    int year;
};
struct facebookUser {
    int id;
    char *userName;
    char *city;
    char gender;
    mDate Dob;
    int *friendList;            //Array of int type, where you will store friend id’s
    int friends = 20;           //Store Number of Friends, default value i 20.
    bool active;                // true for active users and false for inactive
};
void loadUsersfromFile (facebookUser * ul, int &s)
{
    ifstream myFile;
    myFile.open ("users.txt");
    myFile.close ();
}

int main ()
{
    facebookUser *userlist;
    int size;
    size = 4;
    userlist = new facebookUser[50];
    loadUsersfromFile (userlist, size);
}

1 Ответ

0 голосов
/ 10 февраля 2019

Прежде всего, я бы настоятельно рекомендовал , а не , чтобы использовать char * в этом случае.Это совсем не обязательно.Вместо этого используйте std::string.

Например:

struct facebookUser {
    int id;
    std::string userName;
    std::string city;
    char gender;
    mDate Dob;
    int *friendList;            //Array of int type, where you will store friend id’s
    int friends = 20;           //Store Number of Friends, default value i 20.
    bool active;                // true for active users and false for inactive
};

Теперь используйте std :: getline для получения данных.

void loadUsersfromFile (facebookUser * ul, int &s)
{
    ifstream myFile;
    myFile.open ("users.txt");

    unsigned int userIndex = 0;

    if (myFile.is_open()) {
        std::string line;
        while (getline(myFile, line)) {
            std::istringstream sstr(line);
            std::string value;
            unsigned int columnIndex = 0;

            while (getline(sstr, value, '#')) {
                switch (columnIndex) {
                    case 0: {
                        ul[userIndex].id = stoi(value);
                    }
                    break;

                    case 1: {
                        ul[userIndex].userName = value;
                    }
                    break;

                    case 2: {
                        ul[userIndex].city = value;
                    }
                    break;

                    case 3: {
                        ul[userIndex].gender = value[0];
                    }
                    break;

                    case 4: {
                        ul[userIndex].Dob.day = stoi(value);
                    }
                    break;

                    case 5: {
                        ul[userIndex].Dob.month = stoi(value);
                    }
                    break;

                    case 6: {
                        ul[userIndex].Dob.year = stoi(value);
                    }
                    break;

                    case 7: {
                        ul[userIndex].active = (value == "1") ? true : false;
                    }
                    break;

                    default:
                        break;
                }

                columnIndex++;
            }

            userIndex++;
        }
    }
}

Предложение:

Никогда не используйте сырые указатели в вашем коде, если это действительно не необходимо.В вашем случае вы можете заменить int *, facebookuser * на std::vector эквивалентов и char * на std :: string.

...