2

fstream: 列を使用してフォーマットされた出力を作成しようと必死です。

出力を生成する (同じファイル "example.dat" に書き込む) 2 つの関数 (関数 Func1、Func2 に関係なく) があります。

#include <fstream>

int main()
{
    std::ofstream fout;    
    fout.open("example.dat");

    for (int i=0; i<10; i++)
    {
        fout << Func1(i) << std::endl;
    };

    // Func2 depends on Func1, thus them **cannot** be written at the same time: 
    // fout << Func1() << " " << Func2() << std::endl;

    for (int i=0; i<10; i++)
    {
        fout << Func2(i) << std::endl;
    };

    return 0;
}

出力は次のようになります。

機能1(0)

機能1(1)

.

. .

機能1(9)

機能2(0)

機能2(1)

.

.

.

Func2(9)

私の質問は: この出力を 2 つの列として生成する方法:

Func1(0) Func2(0)

Func1(1) Func2(1)

.

.

.

それらは同時に書き込まれませんが。

私は seekp()、tellp() を使用する必要があると思いますが、残念ながら私はこれの専門家ではありません。

助けてください!

前もって感謝します。

4

5 に答える 5

1
vector<ostringstream> streams(10);

for (int i=0; i < 10; ++i)
{
    streams[i] << Func1(i);
}

for (int i=0; i < 10; ++i)
{
    streams[i] << " " << Func2(i);
}

ofstream fout("example.dat");

for (int i=0; i < 10; ++i)
{
    fout << streams[i].str() << endl;
}
于 2012-05-09T12:11:12.247 に答える
0

それらを実際にメモリに保持できないと仮定すると、2つのファイルに書き込み、最初に戻ってそれらを1行ずつ読み戻し、最終ファイルに出力して連結列を作成できます。

このようなものが機能する可能性があります(私はそれをテストしていません):

#include <fstream>
#include <string>
int main()
{
    std::fstream  fs_func1;
    std::fstream  fs_func2;
    std::ofstream fout;

    fs_func1.open("func1.dat")
    for (int i=0;i<10;i++)
    {
        fs_func1 << Func1(i) << std::endl;
    }
    fs_func1.seekg(0); // Set get pointer to start of file

    fs_func2.open("func2.dat");
    for (int i=0;i<10;i++)
    {
        fs_func2 << Func2(i) << std::endl;
    };
    fs_func2.seekg(0); // Set get pointer to start of file

    fout.open("example.dat");
    while (!fs_func1.eof() && !fs_func2.eof())
    {
        std::string func1_line;
        std::string func2_line;

        std::getline(fs_func1, func1_line);
        std::getline(fs_func2, func2_line);

        fout << func1_line << " " << func2_line << std::endl;
    }

    return 0;
}

おそらく、これを1つのステップで実行するUnixコマンドラインツールがあります。

于 2012-05-09T11:04:09.107 に答える
0

テストされていませんが、アイデアはファイルをグリッドとして扱うことです。

const int COLUMN_COUNT = 2;
const int COLUMN_WIDTH = 8;
const int ROW_WIDTH = COLUMN_COUNT * COLUMN_WIDTH + 1; // + 1 is for endl

void write_cell(std::ostream& out, int row, int column, double value) {

  // how many rows is there in the file ?
  out.seekp(0, std::ios_base::end);
  int row_count = out.tellp() / ROW_WIDTH;

  // Do we need to create more rows ?
  for(int i = row_count; i <= row; i++) {
    out.seekp(ROW_WIDTH - 1, std::ios_base::cur);
    out << endl;
  }

  // compute cell position
  int pos = row * ROW_WIDTH + column * COLUMN_WIDTH;

  // move to cell position
  out.seekp(pos);

  // write the cell content
  out << std::setw(COLUMN_WIDTH) << value;
}

int main()
{
  std::ofstream fout;    
  fout.open("example.dat");

  for (int i=0; i<10; i++)
  {
    write_cell(fout, i, 0, Func1(i));
  };

  for (int i=0; i<10; i++)
  {
    write_cell(fout, i, 1, Func2(i));
  };

  return 0;
}
于 2012-05-09T12:33:10.297 に答える
0

なぜ seekp と tellp が必要なのですか (そして、ファイルの途中への書き込みは、いずれにせよ不注意な落とし穴でいっぱいです)

std::vector を使用します (構文はおそらく間違っています)。

std::vector<std::string> res1;
std::vector<std::string> res2;
res1.reserve(10);
res2.reserve(10);
for (std::size_t i = 0; i < 10; ++i)
{
    std::stringstream s;
    s << func1(i);
    res1[i] = s.str();
}
//same for res2, func2
for (std::size_t i = 0; i < 10; ++i)
{

    cout << res1[i] << " " << res2[i] << "\n";
}

それはおそらく間違ったフォーマットであり、ビットを調整する必要があります。std::list の方がうまくいくかもしれません。

于 2012-05-09T10:14:37.270 に答える
-1
for (int i=0;i<10;i++)  
{  
    fout << Func1(i);  
};  
fout<<endl;  

for (int i=0;i<10;i++)  
{  
    fout << Func2(i);  
};  
fout<<endl;  
于 2012-05-09T11:07:49.433 に答える