Format指定类型'char *',但参数类型为'std :: string *'(aka'basic_string *')

问题描述 投票:0回答:1

我正在编写一个C ++程序,在这里我需要从C ++的文件中读取某些格式化的行,该文件的格式为:

<N>
<x> blah blah blah <y>
<x1> blah blah blah <y1>
<x2> blah blah blah <y2>

其中x和y是字符串。我写了这段代码来扫描它:

fscanf(fin, "%d\n", &N);
    for (int i = 0; i < N; i++) {
        if (fscanf(fin, "%s blah blah blah %s\n", &data::x, &data::y) != 1) break;
        pairs.push_back({(string) data::x, data::y});
}

其中N是整数,data是具有字符串xy的名称空间,pairsvector<vector<string>。即使scanf()和类似的内容不会引发读取错误,CLion也会警告我:

[格式指定类型'char *',但参数的类型为'std :: string *'(aka'basic_string *')]

我曾尝试将data::xdata::y更改为char *,但随后CLion给了我另一个警告:

格式指定类型为'char *',但参数的类型为'char **'

当我运行程序时,没有任何输出到标准输出或文件。

这里是完整的代码:

#include <bits/stdc++.h>
using namespace std;

namespace data {
    string x, y;
}

int main() {
    int N;
    FILE *fin = fopen("foo", "r");
    ofstream fout ("bar");
    vector<vector<string>> pairs;

    fscanf(fin, "%d\n", &N);
    for (int i = 0; i < N; i++) {
        if (fscanf(fin, "%s blah blah blah %s\n", &data::x, &data::y) != 1) break;
        pairs.push_back({(string) data::x, data::y});
    }
    cout << pairs.size();
    for (vector<string> i : pairs) {
        cout << i[0] << ' ' << i[1] << endl;
    }

    fclose(fin); fout.close();

    return 0;
}

是否有其他C ++风格的方法来实现,或者我的代码是否需要更改?谢谢!

c++ scanf
1个回答
0
投票
是否还有其他C ++风格的方法可以做到这一点

是。输入的C ++样式是使用std::ifstream而不是std::fscanf

© www.soinside.com 2019 - 2024. All rights reserved.