0

そこで、ifstreamを使用してテキストファイルを開くプログラムを作成しました。このファイルをバイナリで出力するようにします。ofstreamを試し、.write()を使用しましたが、実行するとプログラムがクラッシュします。オンラインで見たように.write()を使用するときに正しく設定しましたが、私が作業していたもので誰もそれを行うのを見たことがありません。誰かがこれに対する解決策を持っていますか?また、「InputFile」と「OutputFile」の両方がそのように青色で強調表示されている理由もわかりません。

#include <iostream>
#include <fstream>
#include <string>
#include <bitset>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        cout << "Error 1";
        return 0;
    }
    else
    {
        int WIDTH, HEIGHT;
        ifstream InputFile;
        InputFile.open(argv[1], ios::in);
        ofstream OutputFile;
        OutputFile.open("OUTPUT.raw", ios::binary | ios::app);
        cout << "Enter Width" << endl;
        WIDTH = cin.get();
        HEIGHT = WIDTH;
        for (int x = 0; x < WIDTH; x++)
        {
            for (int y = 0; y < HEIGHT; y++)
            {
                OutputFile.write((char*)InputFile.get(), sizeof(InputFile));
            }
        }
    }
    //cout << bitset<8>(txt[i]);
    return 0;
};
4

2 に答える 2

2
OutputFile.write((char*)InputFile.get(), sizeof(InputFile));

まず、istream::get()ストリームから 1 文字を抽出し、その値を整数にキャストして返します。結果は一時的なもので、char へのポインターにキャストします! Cスタイルのキャストは基本的にコンパイラに「シューッ、私が何をしているのか知っている!」と伝えるため、コンパイルされますが、実行時に奇妙なことをすることは確かです。書き込みたい値が格納されているオブジェクトのアドレスを取得し、そのアドレスをキャストする必要があります。

次に、ファイル ストリームを管理するクラスsizeof(InputFile)のサイズを返します。ifstreamストリームのバッファにあるデータの数とはまったく関係ありません。

ストリームをテキスト モードで開いた場合、そこからデータを抽出する正しい方法は、抽出演算子 ( >>) を使用することです。次に、それは非常に簡単です:

std::ifstream in_file("numbers.txt");
std::ofstream out_file("numbers.bin", std::ios::binary);

int i;

while (in_file >> i)
    out_file.write(reinterpret_cast<char*>(&i), sizeof(int));

上記のスニペットは、次のような入力テキスト ファイルで機能します-4 21 1990 5425342 -3432 0 100

于 2012-07-24T14:39:31.487 に答える
0

ファイル内のすべての文字列を取得するには、テキスト ファイルを解析intし、新しいファイルを作成してバイナリ データをfputc()orfwrite()関数で書き込む必要があります。

于 2012-07-24T14:14:29.740 に答える