我有一个文件,我想处理它,只需要修改一些信息。我希望,在同一次运行中,为了速度,将文件写入另一个输出文件。
我可以选择我想要的信息(一次运行),然后将文件复制到输出文件(第二次运行)。我只是在一次运行中这样做,所以我可以避免第二次。
以下是我的代码。不要被if条件分心,这些是为了选择我想要的信息。问题是写入其他文件。
void readPoints(char* filename, std::vector<Point>& v, char* outfilename) {
std::ifstream infile;
std::string str;
infile.open(filename);
if (!infile)
std::cout << "File not found!" << std::endl;
std::ofstream outfile;
outfile.open(outfilename);
Point::FT coords[3];
while(1) {
infile >> str;
outfile << str << "\t";
if(str == "ABET")
outfile << std::endl;
if(str == "ATOM") {
infile >> str;
outfile << str << "\t";
if(str == "16" || str == "17" || str == "18" ||
str == "20" || str == "21" || str == "22") {
for(int j = 0; j < 4; ++j) {
infile >> str;
outfile << str << "\t";
}
for (int j = 0; j < 3; ++j) {
infile >> str;
outfile << str << "\t";
coords[j] = std::stod(str);
}
Point p(3, coords);
v.push_back(p);
}
}
if(str == "END")
break;
}
infile.close();
outfile.close();
}
问题是infile
给我带来了单词,而不是空格等等。所以,我使用一个标签将单词彼此分开。但是,这还不够,因为原始文件不是使用制表符,而是(白色)空格,我认为。
原始档案:
ATOM 1 HT1 ASP X 1 9.232 -9.194 6.798 1.00 1.00 ABET
ATOM 2 HT2 ASP X 1 8.856 -7.726 7.401 1.00 1.00 ABET
...
ATOM 50 HH11 ARG X 5 0.925 -3.001 6.677 1.00 1.00 ABET
ATOM 51 HH12 ARG X 5 0.285 -4.616 6.734 1.00 1.00 ABET
...
END
输出文件:
ATOM 1 HT1 ASP X 1 9.232 -9.194 6.798 1.00 1.00 ABET
ATOM 2 HT2 ASP X 1 8.856 -7.726 7.401 1.00 1.00 ABET
...
ATOM 50 HH11 ARG X 5 0.925 -3.001 6.677 1.00 1.00 ABET
ATOM 51 HH12 ARG X 5 0.285 -4.616 6.734 1.00 1.00 ABET
...
END
有谁知道解决这个问题的方法?请注意,两个文件中的信息相同,这些单词之间的距离是困扰我的!
答案 0 :(得分:1)
您似乎正在尝试修改.pdb文件。这个file format非常挑剔,因为它要求间距准确。让它工作的方法是研究格式,并确保在正确的位置放置正确数量的空格。例如,您希望原子编号在第11位完成以与其他文件匹配,因此您在7 - str.length()
和第一个原子编号之间添加ATOM
个空格(因为前四个字符是已经被ATOM
)占用了。对文件的其余部分采用类似的方法,你应该没问题。
答案 1 :(得分:1)
您用于处理此数据格式的功能正在与数据格式作斗争,因为它们并不意味着处理该数据格式。
逐行读取文件到字符串中并使用memcmp / memcpy而不是字符串比较来比较和修改内容。它的固定格式。 (或者您可以使用COBOL轻松处理它j / k!)
char inline[5000];
//open file
//loop thru
// read line to string
if (0==memcmp(inline,"ATOM",4)) ...
// yada yada yada
for (int j = 0; j < 3; ++j) {
char coord[9];
memcpy(coord,inline+offset+j*8,8);
coord[8]=0;
// do something with it...
if (iNeedToWriteToOuptput) {
memcpy(inline+offset+j*8," 0.000");
// etc...
// write string to output
你明白了,希望有所帮助。
答案 2 :(得分:1)
答案基本上就是clcto在问题中评论的内容。
我使用此代码复制文件并进行处理。
void readPoints(char* filename, std::vector<Point>& v, char* outfilename) {
std::ofstream outfile;
outfile.open(outfilename);
std::ifstream infile(filename);
if (!infile) {
std::cout << "File not found!" << std::endl;
return;
}
std::string line;
while (std::getline(infile, line)) {
std::cout << line << std::endl;
// if line of interest, process it
// write to the other file
outfile << line << std::endl;
}
infile.close();
outfile.close();
}
然后我用this回答替换。