跳过从数据文件C ++中读取字符

时间:2016-09-06 09:50:33

标签: c++ ifstream ofstream

我有一个数据文件(A.dat),格式如下:

file

我想读取theta和phi的值(仅)并将它们存储在数据文件(B.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

我试过了:

0.0000        0.00000
1.0000        90.0000
2.0000        180.0000
3.0000        360.0000

我在B.dat中得到这个:

    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();
    }

如何跳过阅读字符和其他内容并仅保存数字?

2 个答案:

答案 0 :(得分:5)

我经常使用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 :(得分:2)

逐行阅读您的文件并删除您不想要的部分:

if ( attrs != null )
{
    TypedArray ta = context.obtainStyledAttributes( attrs, R.styleable.PasswordInputField, 0, 0 );
    try
    {
        String hint = ta.getString( R.styleable.PasswordInputField_hint );
        if ( hint != null )
        {
            passwordInputLayout.setHint( hint );
        }
            float textSize = ta.getDimensionPixelSize( R.styleable.PasswordInputField_textSize, 0 );
        if ( textSize > 0 )
        {
            passwordEditText.setTextSize( TypedValue.COMPLEX_UNIT_PX, textSize );
        }
    }
    finally
    {
        ta.recycle();
    }
}

使用此方法,您不必在将#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的格式:它将与输入文件相同。