如何在输出文件中保持相同的输入文件格式

How to keep the same format of the input file in the output file?

本文关键字:文件 格式 输入 输出      更新时间:2023-10-16

我有一个文件,我想处理它并只获取一些信息来修改。在相同的运行过程中,为了提高速度,我希望将该文件写入另一个输出文件中。

我可以选择我想要的信息(一次运行),然后将文件复制到输出文件(第二次运行)。我只做一次,这样我就可以避免第二次。

下面是我的代码。不要被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();
}

然后我用这个答案来替换