把 `QVector<QPointF>` 写入文件:三种风格、三段独立可编译的完整代码
在 GUI 或数值程序里,经常需要把一组二维点 QPointF
连同它们到原点 O(0,0)
的距离持久化。
距离公式为
di=xi2+yi2
d_i = \sqrt{x_i^{2}+y_i^{2}}
di=xi2+yi2
下面给出 三段完全独立、可直接编译运行 的示例,分别对应
- Qt 原生文件类
QFile
+QTextStream
- 仅使用 标准输出流
std::cout
,方便管道或重定向 - 使用 标准文件流
std::ofstream
每段代码都包含
- 自包含的
main
- 默认生成若干测试点
- 按行输出
x,y,distance
,无外部依赖(除 Qt 头文件外)
① Qt 风:QFile
+ QTextStream
// file_qt.cpp
#include <QVector>
#include <QPointF>
#include <QFile>
#include <QTextStream>
#include <QtMath> // Qt 6: qSqrt;Qt 5 亦可
#include <iostream>int main()
{// 构造演示数据QVector<QPointF> pts{{1.5, 2.0}, {-3, 4}, {0, 0}, {5.7, -8.2}};QFile f("points_qt.txt");if (!f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){std::cerr << "open failed\n";return 1;}QTextStream out(&f);out.setRealNumberPrecision(6);out.setRealNumberNotation(QTextStream::FixedNotation);for (const QPointF &p : pts){qreal d = qSqrt(p.x() * p.x() + p.y() * p.y());out << p.x() << ',' << p.y() << ',' << d << Qt::endl;}f.close();return 0;
}
编译
g++ file_qt.cpp -std=c++17 -fPIC $(pkg-config --cflags --libs Qt6Core) -o file_qt
./file_qt
② 极简风:仅 std::cout
将数据直接写到 标准输出,由 shell 重定向到文件。
无需任何 Qt IO 类,只要包含容器与点定义即可。
// file_stdout.cpp
#include <QVector>
#include <QPointF>
#include <iostream>
#include <cmath>int main()
{QVector<QPointF> pts{{1.5, 2.0}, {-3, 4}, {0, 0}, {5.7, -8.2}};std::cout.setf(std::ios::fixed);std::cout.precision(6);for (const QPointF &p : pts){double d = std::sqrt(p.x() * p.x() + p.y() * p.y());std::cout << p.x() << ',' << p.y() << ',' << d << '\n';}return 0;
}
运行
g++ file_stdout.cpp -std=c++17 -I/usr/include/qt6 -fPIC -o file_stdout
./file_stdout > points_stdout.txt
③ 标准文件流:std::ofstream
// file_ofstream.cpp
#include <QVector>
#include <QPointF>
#include <fstream>
#include <cmath>int main()
{QVector<QPointF> pts{{1.5, 2.0}, {-3, 4}, {0, 0}, {5.7, -8.2}};std::ofstream ofs("points_ofstream.txt", std::ios::out | std::ios::trunc);if (!ofs){std::cerr << "open failed\n";return 1;}ofs.setf(std::ios::fixed);ofs.precision(6);for (const QPointF &p : pts){double d = std::sqrt(p.x() * p.x() + p.y() * p.y());ofs << p.x() << ',' << p.y() << ',' << d << '\n';}return 0;
}
编译
g++ file_ofstream.cpp -std=c++17 -I/usr/include/qt6 -fPIC -o file_ofstream
./file_ofstream
三段代码各自生成同名文件,内容完全一致,例如
1.500000,2.000000,2.500000
-3.000000,4.000000,5.000000
0.000000,0.000000,0.000000
5.700000,-8.200000,10.004999
至此,已覆盖 Qt 原生、标准输出、标准文件流 三种常见场景,按需取舍即可。