Пропустить считывание символов из файла данных С++

Вопрос: У меня есть файл данных (A.dat) со следующим форматом: Theta = 0.0000 Phi = 0.00000 Theta = 1.0000 Phi = 90.0000 Theta = 2.0000 Phi = 180.0000 Theta = 3.0000 Phi = 360.0000 Я хочу читать значения (только) тета и phi и хранить их в файле данных (B.dat) следующим образом: 0.0000 0.00000 1.0000 90.0000

Вопрос:

У меня есть файл данных (A.dat) со следующим форматом:

Theta = 0.0000 Phi = 0.00000 Theta = 1.0000 Phi = 90.0000 Theta = 2.0000 Phi = 180.0000 Theta = 3.0000 Phi = 360.0000

Я хочу читать значения (только) тета и phi и хранить их в файле данных (B.dat) следующим образом:

0.0000 0.00000 1.0000 90.0000 2.0000 180.0000 3.0000 360.0000

Я попробовал это:

int main() { double C[4][2]; ifstream fR; fR.open(«A.dat»); if (fR.is_open()) { for(int i = 0; i<4; i++) fR >> C[i][0] >> C[i][1]; } else cout << «Unable to open file to read» << endl; fR.close(); ofstream fW; fW.open(«B.dat»); for(int i = 0; i<4; i++) fW << C[i][0] << ‘t’ << C[i][1] << endl; fW.close(); }

Я получаю это в B.dat:

0 6.95272e-310 6.95272e-310 6.93208e-310 1.52888e-314 2.07341e-317 2.07271e-317 6.95272e-310

Как пропустить чтение символов и другие вещи и сохранить только цифры?

Лучший ответ:

Я часто использую std :: getline, чтобы пропустить прошлые нежелательные данные, потому что он позволяет вам читать (и прошлое) конкретный символ (в данном случае это “=”):

#include <string> #include <sstream> #include <iomanip> #include <iostream> // pretend file stream std::istringstream data(R»( Theta = 0.0000 Phi = 0.00000 Theta = 1.0000 Phi = 90.0000 Theta = 2.0000 Phi = 180.0000 Theta = 3.0000 Phi = 360.0000 )»); int main() { double theta; double phi; std::string skip; // used to read past unwanted text // set printing format to 4 decimal places std::cout << std::fixed << std::setprecision(4); while( std::getline(data, skip, ‘=’) && data >> theta && std::getline(data, skip, ‘=’) && data >> phi ) { std::cout << ‘{‘ << theta << «, » << phi << ‘}’ << ‘n’; } }

Вывод:

{0.0000, 0.0000} {1.0000, 90.0000} {2.0000, 180.0000} {3.0000, 360.0000}

ЗАМЕТКА:

Я поставил инструкции чтения внутри условия while(). Это работает, потому что чтение из потока возвращает объект потока и когда оно помещается в условие if() или while() оно возвращает true если чтение было успешным или false если сбой чтения.

Таким образом, цикл заканчивается, когда у вас заканчиваются данные.

Ответ №1

Прочитайте строку за строкой своего файла и удалите часть, которую вы не хотите:

#include <iostream> #include <fstream> #include <cstring> int main(int argc, const char *argv[]) { std::ifstream in; std::ofstream out; in.open(«A.dat»); out.open(«B.dat»); if(in.is_open() && out.is_open()) { std::string line; while(std::getline(in, line)) { line.erase(line.find(«Theta»), std::strlen(«Theta = «)); line.erase(line.find(«Phi»), std::strlen(«Phi = «)); out << line << «n»; } } return 0; }

С помощью этого метода вам не нужно управлять форматированием double при его записи в выходной файл: он будет таким же, как и входной.

Оцените статью
Добавить комментарий