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。您要么想使用ysechar-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。您要么想使用ysechar-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上,真是神奇。非常直观。