gpt4 book ai didi

c++ - 来自文件的简单 C++ 输入...如何?

转载 作者:太空宇宙 更新时间:2023-11-04 14:58:38 25 4
gpt4 key购买 nike

我有一个文件:

P 0.5 0.6 0.3
30 300
80 150
160 400
200 150
250 300
T
r 45 0 0
s 0.5 1.5 0 0
t 200 –150
.
.
.

当我读入“P”时,我知道后面会有 3 个 float 。接下来是有限数量的 X 和 Y 坐标。在达到我必须识别的“T”之前,数字会有所不同。然后可能有一个“r”、“s”或“t”,后跟一些值。

无论如何,我知道如何识别“P”然后接受 2 个 float ,但后来我知道我必须有一个用于 X 和 Y 坐标的 while 循环,当我到达“T”时该循环将停止。我对 C++ 了解不够,无法停止循环并识别“T”然后执行其他操作。

一个例子来解释将不胜感激。提前致谢!

最佳答案

我将向您展示我认为这是执行此操作的正确 C++ 方法。首先定义一个类来表示您的第一行并执行它的 IO:

struct FirstLine
{
double x, y, z;
friend std::istream & operator>>(std::istream & is, FirstLine & data)
{
std::string line, ignore;
std::getline(is, line);
std::istringstream iss(line);
iss >> ignore >> data.x >> data.y >> data.z;
assert(ignore == "P" && iss);
return is;
}
friend std::ostream & operator<<(std::ostream & os, FirstLine const & data)
{
return os << "P " << data.x << " " << data.y << " " << data.z;
}
};

我已经使用断言添加了一些基本的错误检查,您可能希望在您的最终程序中使用更健壮的东西。

现在是中间线类:

struct MiddleLine
{
double x, y;
friend std::istream & operator>>(std::istream & is, MiddleLine & data)
{
std::string line;
std::getline(is, line);
if(line == "T")
is.clear(std::ios::failbit);
else
{
int n = sscanf(line.c_str(), "%lf %lf", &data.x, &data.y);
assert(n == 2);
}
return is;
}
friend std::ostream & operator<<(std::ostream & os, MiddleLine const & data)
{
return os << data.x << " " << data.y;
}
};

当我们到达中间线所在部分的末尾时,我们应该会遇到一个“T”。在那种情况下,我们会提高流的失败位,这将告诉客户端没有更多的中间行可以读取。

最后一行的类:

struct LastLine
{
std::string identifier; // r, s or t
std::vector<double> values;
friend std::istream & operator>>(std::istream & is, LastLine & data)
{
std::string line;
std::getline(is, line);
std::istringstream iss(line);
iss >> data.identifier;
assert(data.identifier == "r" || data.identifier == "s"
|| data.identifier == "t");
std::copy(std::istream_iterator<double>(iss),
std::istream_iterator<double>(), std::back_inserter(data.values));
return is;
}
friend std::ostream & operator<<(std::ostream & os, LastLine const & data)
{
os << data.identifier << " ";
std::copy(data.values.begin(), data.values.end(),
std::ostream_iterator<double>(os, " "));
return os;
}
};

最后几行比较复杂,因为我们不知道每行有多少个值,所以我们尽可能多地阅读。

这是棘手的部分。现在我们的 main 函数将简单地读取第一行,然后是未知数量的中间行,最后是未知数量的最后一行:

int main()
{
std::string const data = "P 0.5 0.6 0.3\n
"30 300\n"
"80 150\n"
"160 400\n"
"200 150\n"
"250 300\n"
"T\n"
"r 45 0 0\n"
"s 0.5 1.5 0 0\n"
"t 200 –150";

std::istringstream iss(data);

FirstLine first_line;
iss >> first_line;

std::vector<MiddleLine> middle_lines;
std::copy(std::istream_iterator<MiddleLine>(iss),
std::istream_iterator<MiddleLine>(),
std::back_inserter(middle_lines));
iss.clear();

std::vector<LastLine> last_lines;
std::copy(std::istream_iterator<LastLine>(iss),
std::istream_iterator<LastLine>(),
std::back_inserter(last_lines));
assert(iss.eof());

std::cout << first_line << "\n";
std::copy(middle_lines.begin(), middle_lines.end(),
std::ostream_iterator<MiddleLine>(std::cout, "\n"));
std::copy(last_lines.begin(), last_lines.end(),
std::ostream_iterator<LastLine>(std::cout, "\n"));
return 0;
}

这是您将获得的输出::

P 0.5 0.6 0.3
30 300
80 150
160 400
200 150
250 300
r 45 0 0
s 45 0 0 0.5 1.5 0 0
t 45 0 0 0.5 1.5 0 0 200

我使用字符串作为我的数据源,但您可能希望从文件中读取。

就是这样,你可以看到我没有写一个循环。

Here's the code在键盘上。

关于c++ - 来自文件的简单 C++ 输入...如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2309427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com