Я пишу программу на C ++, с помощью которой я хочу читать и анализировать строки из (.pdb) текстового файла. Текстовый файл содержит своего рода заголовок, состоящий из следующих трех строк:
COMPND MFI
AUTHOR GENERATED BY IRASPA
CRYST1 20.090 19.738 13.142 90.00 9 90.00 90.00 P 1 1
Строки после этого содержат информацию об определенных c атомах соединения и выглядят следующим образом:
ATOM # CHAR 0 FLOAT1 FLOAT2 FLOAT3 1.00 0.00 CHAR
Где # - целое число (номер атома), а CHAR - символ атома (в данном случае O или Si). FLOAT - это координаты x, y и z соответственно.
Первые четыре строки:
ATOM 1 O 0 0.024 8.489 10.490 1.00 0.00 O
ATOM 2 O 0 10.069 1.380 9.223 1.00 0.00 O
ATOM 3 O 0 20.066 11.249 2.652 1.00 0.00 O
ATOM 4 O 0 10.069 8.489 9.223 1.00 0.00 O
До сих пор мне удавалось читать текст построчно и сканировать содержимое используя sscanf
. Однако я не могу сохранить данные в массиве Atom class
, который я создал. Вот как выглядит класс, который включен в мой заголовочный файл:
class Atom {
public:
Atom()
{};'
int atom_num;
char atom_sym[2];
float atom_x, atom_y, atom_z;
};
Вот моя программа на данный момент:
int main()
{
int i;
int Linecount = 0;
Atom atomList[i];
char ign_a, ign_t, ign_o, ign_m; // I use these to store the ATOM of each line
int ign1; // I use this to store the 0 that appears before the coordinates of each line
std::string filename = "textfile.pdb"
std::ifstream file;
file.open (filename.c_str()); // I use this section to get the total number of lines to be parsed
if (!file) {
cout << "Error opening file.";
return -1;
}
if (file.is_open()) {
std::string line;
while (getLine(file, line))
++Linecount;
}
file.close();
file.open (filename.c_str());
if (file.is_open()) {
std::string line;
int atom_num;
char atom_sym[2];
float atom_x, atom_y, atom_z;
for (i = 1; i < Linecount; ++i) { // I have tried this for loop in different sections of the program but nothing seems to work
while (getline(file, line)) {
if (line.find("ATOM") == 0) {
sscanf(line.c_str(), "%c%c%c%c %d %s %d %f %f %f", &ign_a, &ign_t, &ign_o, &ign_m,
&atom_num, atom_sym, &ign1, &atom_x, &atom_y, &atom_z); //
atomList[i].atom_num = atom_num; // This is where I attempt to store the data into the array
strcpy(atomList[i].atom_sym, atom_sym);
atomList[i].atom_x = atom_x;
atomList[i].atom_y = atom_y;
atomList[i].atom_z = atom_z;
}
printf("%d %s %.3f %.3f %.3f\n", atomList[i].atom_num, atomList[i].atom_sym,
atomList[i].atom_x, atomList[i].atom_y, atomList[i].atom_z); // Test reading of lines
}
}
file.close();
int j = 10;
printf("TEST: %d %s %.3f %.3f %.3f\n", atomList[j].atom_num, atomList[j].atom_sym,
atomList[j].atom_x, atomList[j].atom_y, atomList[j].atom_z); // Print function to test storing into array
return 0;
}
Первая функция печати работает правильно, хотя печатает три «мусорные» строки, которые я предполагаю, связаны с заголовком текстового файла, несмотря на использование оператора if (line.find("ATOM") == 0)
. Вот вывод:
0 0.000 0.000 0.000
0 0.000 0.000 0.000
0 0.000 0.000 0.000
1 O 0.024 8.489 10.490
2 O 10.069 1.380 9.223
3 O 20.066 11.249 2.652
4 O 10.069 8.489 9.223
Вторая функция печати, однако, печатает только нулевые значения, что указывает на то, что данные не сохраняются в массив правильно. Я также пытался использовать std::cin
и std::cout
для назначения и печати данных, но это не помогло. Вот вывод для второй функции печати:
TEST: 0 0.000 0.000 0.000
Моя основная проблема заключается в том, что я не могу сохранить данные из входного файла в массив atomList [i] класса Atom.
Буду признателен за любую помощь в этом. Спасибо!