使用 space 分隔符从文本文件中将对象读入数组
Reading objects into an array from a text file with space delimiter
美好的一天,
我正在尝试将文件中的数据读入对象数组。我似乎找不到如何处理 space 定界符。请帮助我。
class 称为 Rational,它有两个属性:num 和 denom.
文件数据:1/2 -1/3 3/10 4/5 6/18
到目前为止我已经这样做了:
int operator>>(ifstream& fin, rational r[]) {
fin.open("filedata.txt", ios::in);
if (fin)
{
for (int i = 0; i < 5; i++)
{
fin >> r[i];
}
}
else
{
cout << "\nData file cannot be found!" << endl;
}
}
ifstream& operator>>(ifstream& in, rational& r)
{
int num, denom;
char slash;
in >> num >> slash >> denom;
r.set(num,denom);
return in;
}
提前致谢。
函数 operator>>(ifstream& in, rational& r)
应该像发布的那样工作,尽管我会将其更改为
std::istream& operator>>(std::istream& in, rational& r) { ... }
但是,第一个功能不对。即使 return 类型是 int
,您也不会 return 从函数中获取任何内容。您可以将其更改为:
int operator>>(ifstream& fin, rational r[])
{
int count = 0;
fin.open("filedata.txt", ios::in);
if (fin)
{
for ( ; count < 5; ++count)
{
// If unable to read, break out of the loop.
if ( !(fin >> r[count] )
{
break;
}
}
}
else
{
cout << "\nData file cannot be found!" << endl;
}
return count;
}
话虽如此,我认为你可以稍微改进一下那个功能。
在调用函数中打开文件,main
可能,然后将 std::ifstream
对象传递给它。
与其传递一个数组,不如传递一个std::vector
。然后,您不必担心文件中的条目数。您阅读文件中的任何内容。
将 return 类型更改为 std::istream&
以便您可以在必要时链接调用。
std::istream& operator>>(std::istream& in, std::vector<rational>& v)
{
rational r;
while ( in >> r )
{
v.push_back(r);
}
return in;
}
在main
(或更高级别的函数)中,使用:
std::vector<rational> v;
std::ifstream fin("filedata.txt);
if ( !fin )
{
// Deal with error.
}
else
{
fin >> v;
}
// Use v as you see fit.
美好的一天,
我正在尝试将文件中的数据读入对象数组。我似乎找不到如何处理 space 定界符。请帮助我。
class 称为 Rational,它有两个属性:num 和 denom.
文件数据:1/2 -1/3 3/10 4/5 6/18
到目前为止我已经这样做了:
int operator>>(ifstream& fin, rational r[]) {
fin.open("filedata.txt", ios::in);
if (fin)
{
for (int i = 0; i < 5; i++)
{
fin >> r[i];
}
}
else
{
cout << "\nData file cannot be found!" << endl;
}
}
ifstream& operator>>(ifstream& in, rational& r)
{
int num, denom;
char slash;
in >> num >> slash >> denom;
r.set(num,denom);
return in;
}
提前致谢。
函数 operator>>(ifstream& in, rational& r)
应该像发布的那样工作,尽管我会将其更改为
std::istream& operator>>(std::istream& in, rational& r) { ... }
但是,第一个功能不对。即使 return 类型是 int
,您也不会 return 从函数中获取任何内容。您可以将其更改为:
int operator>>(ifstream& fin, rational r[])
{
int count = 0;
fin.open("filedata.txt", ios::in);
if (fin)
{
for ( ; count < 5; ++count)
{
// If unable to read, break out of the loop.
if ( !(fin >> r[count] )
{
break;
}
}
}
else
{
cout << "\nData file cannot be found!" << endl;
}
return count;
}
话虽如此,我认为你可以稍微改进一下那个功能。
在调用函数中打开文件,
main
可能,然后将std::ifstream
对象传递给它。与其传递一个数组,不如传递一个
std::vector
。然后,您不必担心文件中的条目数。您阅读文件中的任何内容。将 return 类型更改为
std::istream&
以便您可以在必要时链接调用。
std::istream& operator>>(std::istream& in, std::vector<rational>& v)
{
rational r;
while ( in >> r )
{
v.push_back(r);
}
return in;
}
在main
(或更高级别的函数)中,使用:
std::vector<rational> v;
std::ifstream fin("filedata.txt);
if ( !fin )
{
// Deal with error.
}
else
{
fin >> v;
}
// Use v as you see fit.