如何在输出文件中保持相同的输入文件格式
How to keep the same format of the input file in the output file?
我有一个文件,我想处理它并只获取一些信息来修改。在相同的运行过程中,为了提高速度,我希望将该文件写入另一个输出文件中。
我可以选择我想要的信息(一次运行),然后将文件复制到输出文件(第二次运行)。我只做一次,这样我就可以避免第二次。
下面是我的代码。不要被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
有人知道解决这个问题的方法吗?请注意,两个文件中的信息是相同的,单词之间的距离是什么困扰我!
您似乎正在尝试修改.pdb文件。这种文件格式非常挑剔,因为它需要精确的间距。实现这一点的方法是研究格式,并确保在正确的位置放置正确数量的空格。例如,您希望原子序数在第11位结束,以便与另一个文件匹配,因此您在ATOM
和第一个原子序数之间添加7 - str.length()
空白(7,因为前四个字符已经被ATOM
占用了)。对文件的其余部分采用类似的方法,应该就没问题了。
用于处理这种数据格式的函数正在与数据格式作斗争,因为它们并不打算处理这种数据格式。
将文件逐行读入字符串,并使用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
你明白了,希望对你有所帮助。
答案基本上就是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();
}
然后我用这个答案来替换
相关文章:
- 文件格式的编写解释器(C++ Arduino)
- 如何使用 lldb 在曼扎罗中调试 lz4 文件格式的核心转储?
- Assimp - 如何使用任何文件格式导入带有纹理的网格?
- boost::p rogram_options 配置文件格式
- 如何启用libMagick++以保存.png文件格式
- 生成库失败:无法识别文件格式;作为链接器脚本处理
- 有没有更好的方法来使用比特流解码文件格式?
- MySQL C++连接器:添加符号时出错:文件格式无法识别
- Qt解析自定义文件格式
- ADTF 录制文件格式
- /usr/bin/ld找不到标头:未识别的文件格式
- C 库从3D文件格式(例如STL)获得常规网格
- 随机访问文件格式,用于分层组织的二进制文件和文本文件
- C OPENCV 3.4 / FFMPEG 3.4.1 VIDEOWRITER和MP4输出文件格式
- 具有挑战性的数据文件格式,需要将其读取为包含类对象的数组的VAR
- GDB错误不以可执行格式:未识别的文件格式
- 如何获取 C++/Qt 格式的文件格式
- GetText PO文件格式
- 如何在 c++ 中从".in"格式的文件中获取输入?此代码进入无限循环,但适用于".txt"文件格式
- 用于将三维模型导入OpenGL/C++项目的推荐文件格式和图形库