引用回帖: 13楼 : Originally posted by
mljphy at 2013-06-03 17:54:42
谢谢你的回复。你的代码我仔细检验了。对于我原来的输入文件,在修改了路径那行:
std::string filename = "D:\\Skydrive\\MyCode\\cpp\\TreatString\\TreatString\\src\\test.txt"; //
改为
const c ...
可以试试我这个看看。
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <cassert>
int main(void)
{
// path of the input ...
谢谢你的回复。你的代码我仔细检验了。对于我原来的输入文件,在修改了路径那行:
std::string filename = "D:\\Skydrive\\MyCode\\cpp\\TreatString\\TreatString\\src\\test.txt"; //
改为
const char *filename = "D:\\Skydrive\\MyCode\\cpp\\TreatString\\TreatString\\src\\test.txt"; //
并修改重复定义的k之后能够得到正确的结果。
我试着朝我最终的输入文件修改了一下输入文件数据(test.txt),现在的数据格式如下(数字都是变量,包括16000.0):
ITEM: TIMESTEP
16000.0
Frame
5.0 2.0 4.0 5.0
1.0 4.0 11.0 11.0
3.0 6.0 15.0 77.0
1.0 6.0 15.0 28.0
ITEM: TIMESTEP
16000.0
Frame
6.0 2.0 41.0 23.0
1.0 6.0 15.0 28.0
7.0 9.0 17.0 33.0
1.0 6.0 15.0 62.0
ITEM: TIMESTEP
16000.0
Frame
9.0 4.0 11.0 41.0
3.0 6.0 12.0 62.0
8.0 9.0 17.0 89.0
7.0 6.0 13.0 28.0
ITEM: TIMESTEP
16000.0
Frame
3.0 4.0 13.0 41.0
5.0 2.0 15.0 61.0
8.0 9.0 17.0 59.0
6.0 6.0 15.0 23.0
然后我按我的理解修改了一下代码,修改后如下(在VC 6.0中 原来代码中k有重定义现象,不知何故,我该成了k1,k2,k3,k4):
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <cassert>
int main(void)
{
// path of the input file
const char *filename = "G:\\cpp\\2\\test.txt"; // Please edit this line according to you real path of the test.txt file
std::ifstream infile(filename);
// check if file exists
if(!infile) { std::cerr << "file "<< filename << " not found." << std::endl; }
std::string line; // string that stores each line read in
std::vector<double> vals; // vector that stores values should be read
std::vector<double> vt;
// read file line by line
while(std::getline(infile, line))
{
if(line == "ITEM: TIMESTEP" { continue; }
double vab;
std::istringstream iss1(line);
iss1 >> vab;
vt.push_back(vab);
if(line == "Frame" { continue; }
if(line == "" { continue; }
double val1, val2, val3, val4;
std::istringstream iss(line);
iss >> val1 >> val2 >> val3>> val4;
vals.push_back(val1);
vals.push_back(val2);
vals.push_back(val3);
vals.push_back(val4);
}
// check and make sure 27 values are stored in vector vals.
assert(vals.size() == 64);
double a1[10][10], a2[10][10], a3[10][10], a4[10][10];
int nn=4;
// pass value from vals to a1, a2, a3
for(size_t k = 0; k < nn; ++k)
{
for(size_t n = 0; n < nn; ++n)
{
a1[k][n] = vals[4*k+n];
a2[k][n] = vals[16 + 4*k+n];
a3[k][n] = vals[32 + 4*k+n];
a4[k][n] = vals[48 + 4*k+n];
}
}
// output a1, a2, a3,a4
std::cout << "a1:"<<std::endl;
for(size_t k1 = 0; k1 < nn; ++k1)
{
for(size_t n = 0; n < nn; ++n)
std::cout<< a1[k1][n] << "\t";
std::cout << std::endl;
}
std::cout << "a2:"<<std::endl;
for(size_t k2 = 0; k2 < nn; ++k2)
{
for(size_t n = 0; n < nn; ++n)
std::cout<< a2[k2][n] << "\t";
std::cout << std::endl;
}
std::cout << "a3:"<<std::endl;
for(size_t k3 = 0; k3 < nn; ++k3)
{
for(size_t n = 0; n < nn; ++n)
std::cout<< a3[k3][n] << "\t";
std::cout << std::endl;
}
std::cout << "a4:"<<std::endl;
for(size_t k4 = 0; k4 < nn; ++k4)
{
for(size_t n = 0; n < nn; ++n)
std::cout<< a4[k4][n] << "\t";
std::cout << std::endl;
}
return 0;
}
1.我发现如果输入文件(test.txt)中只加入第1,8,15,22行(对应ITEM: TIMESTEP),并在代码中加入下列代码行:
if(line == "ITEM: TIMESTEP" { continue; }
程序能够正常运行,并输出正确结果。
2.如果再加入第2,9,16,23行(对应16000.0),并加入相应代码
double vab;
std::istringstream iss1(line);
iss1 >> vab;
vt.push_back(vab);
程序却不能正确运行,输出的错误为:
assert(vals.size() == 64);
此行有问题,如果我注视掉将出现错误结果。
不知道为什么?
我最终的数据格式如下(实例):
ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0 100.0
0.0 100.0
0.0 100.0
Frame
5.0 2.0 4.0 5.0 6.0
1.0 4.0 11.0 11.0 7.0
3.0 6.0 15.0 77.0 8.0
1.0 6.0 15.0 28.0 11.0
......共171行......
ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0 100.0
0.0 100.0
0.0 100.0
Frame
6.0 2.0 41.0 23.0 9.9
1.0 6.0 15.0 28.0 11.7
7.0 9.0 17.0 33.0 20.8
1.0 6.0 15.0 62.0 0.9
......共171行......
ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0 100.0
0.0 100.0
0.0 100.0
Frame
9.0 4.0 11.0 41.0 8.0
3.0 6.0 12.0 62.0 20.0
8.0 9.0 17.0 89.0 80.0
7.0 6.0 13.0 28.0 20.0
......共171行......
ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0 100.0
0.0 100.0
0.0 100.0
Frame
3.0 4.0 13.0 41.0 12.0
5.0 2.0 15.0 61.0 15.0
8.0 9.0 17.0 59.0 22.0
6.0 6.0 15.0 23.0 88.0
......共171行......
再次感谢。