以格式化/顺序方式从文本文件中提取数据

时间:2018-02-16 19:56:45

标签: c++ file structure store

我有一个带有这种结构的文件.txt:

  

000010109000010309000010409

我需要这样阅读:

00001 01 09
00001 03 09
00001 04 09

我有这样的结构:

struct A{
    string number // first 5 numbers
    int day; // 2 numbers
    int month; // last 2 numbers
};

我试过这种方式。 但是不行。

    char number[6];
    char day[3];
    char monthes[3];
    ifstream read("file.txt");
    for (int i = 0; i < 100; i++) {
        read.get(number,6);
        structure[i].number= number;
        read.get(day,3);
        structure[i].day= atoi(day);
        read.get(month,3);
        structure[i].month= atoi(month);
    }

如何读取文件中的数据并将其存储到此结构中? 如何比较这个数字是否在同一个月有多天。 非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

FILE *fp = fopen("file.txt", "r");
A a;
char x[6], y[3], z[3];
fscanf(fp, "%5s%2s%2s", x, y, z);
a.number = string(x);
a.day = atoi(y);
a.month = atoi(z);

修改

它是有效的C ++代码(包含cstdiocstdlib),但是如果你想要一些 C ++ 版本,你可以尝试这样的东西

// read from file.txt
std::ifstream inFile("file.txt", std::ios::in);
char number[6], day[3], month[3];
int cnt = 0;
while (inFile.get(number, 6) && inFile.get(day, 3) && inFile.get(month, 3)) {
    // Let's assume that structure[] is array of struct A
    structure[cnt].number = number;
    structure[cnt].day = atoi(day);
    structure[cnt].month = atoi(month);
    ++cnt;
}
// store to file2.txt
std::ofstream outFile("file2.txt", std::ios::out);
for (int i = 0; i < cnt; ++i) {
    outFile << structure[i].number << ' ' << structure[i].day << ' ' << structure[i].month << std::endl;
    // If you need fixed-width for day/month, use std::setw and std::setfill
}
// compare first two
if (cnt >= 2) {
    if (structure[0].number == structure[1].number &&
        structure[0].month  == structure[1].month  &&
        structure[0].day    == structure[1].day) {
            std::cout << "Same!" << std::endl;
    } else {
        std::cout << "Different!" << std::endl;
    }
}

答案 1 :(得分:1)

我在这里使用stringstream作为示例,但同样适用于fstream。根据需要将数字char数组转换为所需的数据类型(所有都是'\ 0'终止)< / p>

#include <iostream>
#include <sstream>

int main() {

    std::string s = "000010109000010309000010409";
    std::istringstream iss(s);

    char number[6], day[3], month[3];
    while (iss.get(number, 6) && iss.get(day, 3) && iss.get(month, 3))
        std::cout << number << " " << day << " " << month << std::endl;

    return 0;
}

https://ideone.com/tyBShW

00001 01 09
00001 03 09
00001 04 09