c++ - Qt读取文本文件的一些信息

标签 c++ string qt file qt5

我有一个 .txt 文件,需要从中读取。该文件包含城市数据、经度、纬度和其他一些内容。

这就是数据格式:

DE  01945   **Tettau**  Brandenburg BB      00  Landkreis Oberspreewald-Lausitz 12066   **51.4333   13.7333**

DE  01968   **Schipkau Hörlitz**    Brandenburg BB      00  Landkreis Oberspreewald-Lausitz 12066   **51.5299   13.9508**

...

文件的每一行都是一个城市,但对我来说,只有粗体信息才重要(名称、纬度、经度)。该文件总共有 16k 行。 你能解释一下我是如何获得这些信息的吗?

QFile file ("path");
QTextStream in (&file);
while (!in.atEnd()) {
    QString line = in.readLine();
    std::string s = line.toLocal8Bit().constData();
    std::cout << s << endl;
}
file.close();

到目前为止,我只能读取整行,但我不知道如何获取每行的这 3 个信息。 我创建了一个由三名成员组成的“城市”类(class)。 _名称、_经度、_纬度。然后我想创建一个 vector 来保护里面每个城市的安全。这个方法有效吗? 但更重要的是请告诉我如何阅读每行的这 3 个粗体信息,因为我不知道该怎么做。 (我想遍历字符串的每个字符并搜索制表符,但花了很长时间)。 因此,如果您向我展示一种快速的方法,我真的很高兴。程序是用C++在Qt中开发的。

PS:我还注意到一些城市名称由两个单词组成,并用空格分隔的问题。

最佳答案

您拥有的文件是制表符分隔值(TSV),因此逻辑是获取每一行并通过制表符分隔,然后选择元素,如下所示:

#include <QFile>
#include <QTextStream>

#include <iostream>

struct CityData
{
    std::string city;
    float latitude;
    float longitude;
};

int main()
{
    QFile file("/path/of/DE.txt");
    if(!file.open(QFile::ReadOnly | QFile::Text))
        return -1;

    QTextStream stream(&file);
    QString line;

    std::vector<CityData> datas;

    while (stream.readLineInto(&line)) {
        QStringList elements = line.split("\t");

        CityData data{elements[2].toStdString(),
                    elements[9].toFloat(),
                    elements[10].toFloat()
                     };
        datas.push_back(data);
    }
    for(const CityData & data: datas){
        std::cout<< "city: "<< data.city <<"\t" << "latitude: "<< data.latitude <<"\t" << "longitude: "<<data.longitude<<"\n";
    }
    return 0;
}

输出:

city: Tettau    latitude: 51.4333   longitude: 13.7333
city: Guteborn  latitude: 51.4167   longitude: 13.9333
city: Hermsdorf latitude: 51.4055   longitude: 13.8937
city: Grünewald latitude: 51.4  longitude: 14
city: Hohenbocka    latitude: 51.431    longitude: 14.0098
city: Lindenau  latitude: 51.4  longitude: 13.7333
city: Ruhland   latitude: 51.4576   longitude: 13.8664
city: Schwarzbach   latitude: 51.45 longitude: 13.9333
city: Kroppen   latitude: 51.3833   longitude: 13.8
city: Schipkau Hörlitz  latitude: 51.5299   longitude: 13.9508
city: Senftenberg   latitude: 51.5252   longitude: 14.0016
city: Schipkau  latitude: 51.5456   longitude: 13.9121
...

在此类 Material 中,您应该阅读readme.txt:

...

The data format is tab-delimited text in utf8 encoding, with the following fields :

country code      : iso country code, 2 characters
postal code       : varchar(20)
place name        : varchar(180)
admin name1       : 1. order subdivision (state) varchar(100)
admin code1       : 1. order subdivision (state) varchar(20)
admin name2       : 2. order subdivision (county/province) varchar(100)
admin code2       : 2. order subdivision (county/province) varchar(20)
admin name3       : 3. order subdivision (community) varchar(100)
admin code3       : 3. order subdivision (community) varchar(20)
latitude          : estimated latitude (wgs84)
longitude         : estimated longitude (wgs84)
accuracy          : accuracy of lat/lng from 1=estimated to 6=centroid

关于c++ - Qt读取文本文件的一些信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013756/

相关文章:

c++ - 整数集之间的映射

qt - vs2013 编译用于调试但不用于发布?

c++ - 当 const 指针用作函数的参数时

c++ - OpenGL 忽略四边形并将它们变成三角形

c++ - 如何使用 std::string 作为 stxxl::map 中的键

javascript - 将javascript数组转换为字符串

c++ - QtCreator 无法在 Linux 上找到 Qxt header ?

c++ - 包括 ZenLib/Ztring.h 在内的字符串常量之前的预期 unqualified-id

c++ - MFC 树控件通知被触发两次

c# - String 、 Int32 等的操作在哪里定义?