我正在编写一个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
是具有字符串x
和y
的名称空间,pairs
是vector<vector<string>
。即使scanf()
和类似的内容不会引发读取错误,CLion也会警告我:
[格式指定类型'char *',但参数的类型为'std :: string *'(aka'basic_string *')]
我曾尝试将data::x
和data::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 ++风格的方法可以做到这一点是。输入的C ++样式是使用
std::ifstream
而不是std::fscanf
。