跳过从数据文件 C++ 中读取字符
Skip reading characters from a data file C++
我有一个数据文件 (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
我想(仅)读取 theta 和 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
如何跳过读取字符和其他内容而只保存数字?
逐行阅读文件并删除不需要的部分:
#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
写入输出文件时,您无需管理其格式:它将与输入文件相同。
我经常使用 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()
条件中。这是有效的,因为从 stream returns 读取 stream 对象并放入 if()
或 while()
条件它 returns true
如果读取成功或 false
如果读取失败。
因此当您 运行 数据不足时循环终止。
我有一个数据文件 (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
我想(仅)读取 theta 和 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
如何跳过读取字符和其他内容而只保存数字?
逐行阅读文件并删除不需要的部分:
#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
写入输出文件时,您无需管理其格式:它将与输入文件相同。
我经常使用 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()
条件中。这是有效的,因为从 stream returns 读取 stream 对象并放入 if()
或 while()
条件它 returns true
如果读取成功或 false
如果读取失败。
因此当您 运行 数据不足时循环终止。