C++ 从文件中取出数据并以字符串形式存储在C++;

C++ 从文件中取出数据并以字符串形式存储在C++;,c++,string,pointers,C++,String,Pointers,我有一个文件,其中包含以下格式的学生记录 Umar|Ejaz|12345|umar@umar.com Majid|Hussain|12345|majid@majid.com Ali|Akbar|12345|ali@geeks-inn.com Mahtab|Maqsood|12345|mahtab@myself.com Juanid|Asghar|12345|junaid@junaid.com 数据已按照以下格式存储: firstName|lastName|contactNumber|email

我有一个文件,其中包含以下格式的学生记录

Umar|Ejaz|12345|umar@umar.com
Majid|Hussain|12345|majid@majid.com
Ali|Akbar|12345|ali@geeks-inn.com
Mahtab|Maqsood|12345|mahtab@myself.com
Juanid|Asghar|12345|junaid@junaid.com
数据已按照以下格式存储:

firstName|lastName|contactNumber|email
行(记录)总数不能超过限制100。在我的程序中,我定义了以下字符串变量

#define MAX_SIZE 100
// other code
string firstName[MAX_SIZE];
string lastName[MAX_SIZE];
string contactNumber[MAX_SIZE];
string email[MAX_SIZE];
ifstream readFromFile;  
readFromFile.open("output.txt");
// other code
int x = 0;
string temp;

while(getline(readFromFile, temp)) {
    int charPosition = 0;
    while(temp[charPosition] != '|') {
        firstName[x] += temp[charPosition];
        charPosition++;
    }
    while(temp[charPosition] != '|') {
        lastName[x] += temp[charPosition];
        charPosition++;
    }
    while(temp[charPosition] != '|') {
        contactNumber[x] += temp[charPosition];
        charPosition++;
    }
    while(temp[charPosition] != endl) {
        email[x] += temp[charPosition];
        charPosition++;
    }
    x++;
}
现在,我想从文件中提取数据,并使用分隔符“|”,将数据放入相应的字符串中。我使用以下策略将数据放回字符串变量中

#define MAX_SIZE 100
// other code
string firstName[MAX_SIZE];
string lastName[MAX_SIZE];
string contactNumber[MAX_SIZE];
string email[MAX_SIZE];
ifstream readFromFile;  
readFromFile.open("output.txt");
// other code
int x = 0;
string temp;

while(getline(readFromFile, temp)) {
    int charPosition = 0;
    while(temp[charPosition] != '|') {
        firstName[x] += temp[charPosition];
        charPosition++;
    }
    while(temp[charPosition] != '|') {
        lastName[x] += temp[charPosition];
        charPosition++;
    }
    while(temp[charPosition] != '|') {
        contactNumber[x] += temp[charPosition];
        charPosition++;
    }
    while(temp[charPosition] != endl) {
        email[x] += temp[charPosition];
        charPosition++;
    }
    x++;
}
是否需要在每个字符串的末尾附加空字符“\0”?如果我不附加,当我在程序中实际实现这些字符串变量时,它会产生问题吗。我是C++新手,我想出了这个解决方案。如果任何人有更好的技术,他肯定是受欢迎的

编辑:我也不能比较字符(acter)和endl,我怎么能

编辑:我写的代码不起作用。它给了我以下的错误

     Segmentation fault (core dumped)

注意:我只能使用.txt文件。无法使用.csv文件

如果不使用空字符终止C样式字符串,则无法确定字符串的结束位置。因此,您需要终止字符串

我个人会将数据读入
std::string
对象:

std::string first, last, etc;
while (std::getline(readFromFile, first, '|')
    && std::getline(readFromFile, last, '|')
    && std::getline(readFromFile, etc)) {
    // do something with the input
}
std::endl
是作为函数模板实现的操纵器。您无法将
字符与该字符进行比较。几乎没有理由使用
std::endl
,因为它在添加换行符后刷新流,这使得编写速度非常慢。您可能打算与换行符进行比较,即与
“\n”
。但是,由于使用
std::getline()
读取字符串,换行符将被删除!您需要确保访问的字符数不超过
temp.size()


您的记录还包含字符串数组而不是字符数组,您可以为它们分配单个
char
s。您要么想使用yse
char-something[SIZE]
,要么存储字符串

如果不使用空字符终止C样式字符串,则无法确定字符串的结束位置。因此,您需要终止字符串

我个人会将数据读入
std::string
对象:

std::string first, last, etc;
while (std::getline(readFromFile, first, '|')
    && std::getline(readFromFile, last, '|')
    && std::getline(readFromFile, etc)) {
    // do something with the input
}
std::endl
是作为函数模板实现的操纵器。您无法将
字符与该字符进行比较。几乎没有理由使用
std::endl
,因为它在添加换行符后刷新流,这使得编写速度非常慢。您可能打算与换行符进行比较,即与
“\n”
。但是,由于使用
std::getline()
读取字符串,换行符将被删除!您需要确保访问的字符数不超过
temp.size()


您的记录还包含字符串数组而不是字符数组,您可以为它们分配单个
char
s。您要么想使用yse
char-something[SIZE]
,要么存储字符串

有很多方法可以做到这一点。我建议在StackOveflow中搜索“[C++]读取文件”以查看更多方法

查找和子字符串
您可以使用
std::string::find
方法查找分隔符,然后使用
std::string::substr
返回位置和分隔符之间的子字符串

std::string::size_type position = 0;
positition = temp.find('|');
if (position != std::string::npos)
{
    firstName[x] = temp.substr(0, position);
}

有很多方法可以做到这一点。我建议在StackOveflow中搜索“[C++]读取文件”以查看更多方法

查找和子字符串
您可以使用
std::string::find
方法查找分隔符,然后使用
std::string::substr
返回位置和分隔符之间的子字符串

std::string::size_type position = 0;
positition = temp.find('|');
if (position != std::string::npos)
{
    firstName[x] = temp.substr(0, position);
}

对当您编写C风格的代码时,一个非null终止的字符串将导致各种各样的问题。例如,代码> STRULN()/CUT>会返回一些疯狂的值,因为它会一直扫描字符串直到找到空值,这可能是“永远”。我将写C++中的所有代码,而不是在C.中,这样会不会导致C++中的问题?为什么要这样做:FixNeX[X] + = TEMP[字符];?而且不仅=(equal)和x变量在每个while上总是有相同的值,所以文件中的所有字符都写在每个字符串的0位置,覆盖最后一个。这是一个棘手的部分。firstName[0](假设x是0)是字符串,而不是字符。因此,每次执行firstName[0]+=temp[charPosition]时,都会在字符串firstName[0]中添加或追加一个新字符。是的。当您编写C风格的代码时,一个非null终止的字符串将导致各种各样的问题。例如,代码> STRULN()/CUT>会返回一些疯狂的值,因为它会一直扫描字符串直到找到空值,这可能是“永远”。我将写C++中的所有代码,而不是在C.中,这样会不会导致C++中的问题?为什么要这样做:FixNeX[X] + = TEMP[字符];?而且不仅=(equal)和x变量在每个while上总是有相同的值,所以文件中的所有字符都写在每个字符串的0位置,覆盖最后一个。这是一个棘手的部分。firstName[0](假设x是0)是字符串,而不是字符。因此,每次我执行firstName[0]+=temp[charPosition]时,都会在字符串firstName[0]中添加或追加一个新字符。这很神奇。非常直观。我很想用它。但是请告诉我,我的代码有什么问题,因为它不起作用,它给我造成了分割错误的错误(内核转储),我不知道为什么它不能工作?当你单步用调试器,哪一行失败了?我对C++和这个世界是新的。所以我不使用C++调试器。我正在编写我的简单程序,并在Ubuntu上使用命令行工具通过g++运行它们。在网上搜索手册。它在Ubuntu上,真是神奇。非常直观。