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

时间:2014-08-21 17:29:08

标签: c++ file copy

我有一个文件,我想处理它,只需要修改一些信息。我希望,在同一次运行中,为了速度,将文件写入另一个输出文件。

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

以下是我的代码。不要被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

有谁知道解决这个问题的方法?请注意,两个文件中的信息相同,这些单词之间的距离是困扰我的!

3 个答案:

答案 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回答替换。

相关问题