【发布时间】:2015-07-08 12:17:58
【问题描述】:
我写这个是为了解析一个带有数字的文件,其中分隔符只是一个空格。我的目标是读取文件的每个数字并将其存储在矩阵A 的相应索引中。所以,读到的第一个号码应该转到A[0][0],第二个号码应该转到A[0][1],以此类推。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
const int N = 5, M = 5;
double A[N*M];
string fname("test_problem.txt");
ifstream file(fname.c_str());
for (int r = 0; r < N; ++r) {
for (int c = 0; c < M; ++c) {
file >> *(A + N*c + r);
}
}
for (int r = 0; r < N; ++r) {
for (int c = 0; c < M; ++c) {
cout << *(A + N*c + r) << " ";
}
cout << "\n";
}
cout << endl;
return 0;
}
现在,我正在尝试解析这样的文件:
1 ;2 ;3 ;4 ;5
10 ;20 ;30 ;40 ;50
0.1 ;0.2 ;0.3 ;0.4 ;0.5
11 ;21 ;31 ;41 ;5
1 ;2 ;3 ;4 ;534
但它会打印(因此读取)垃圾。我该怎么办?
编辑
这是我在 C 中的尝试,但也失败了:
FILE* fp = fopen("test_problem.txt", "r");
double v = -1.0;
while (fscanf(fp, "%f ;", &v) == 1) {
std::cout << v << std::endl;
}
-1 将始终被打印出来。
【问题讨论】:
-
所有
*(A + N*c + r)都可以改成A[N*c + r]。 -
你需要提供一个更好的测试用例来准确地说明你想要做什么。由于目前正在编写问题,我可以编写一个程序,读取每行中的每三个字符,我猜这不是你想要的。
-
timrau,是的,但这应该不是问题。 @RedRoboHood 我编辑了我的目标。我认为测试用例很好,我想用文件的数字填充矩阵。
-
@gsamaras 测试用例的问题在于它使每个数字看起来都将是相同的宽度,或者更糟糕的是,每个数字都将是一个字符。这是真的吗?
-
矩阵中的空格和分号似乎没有被您的代码处理。也许在第一个(for int c)语句中使用 c+=3 而不是 ++c
标签: c++ file fstream text-parsing