0

私はどこでもそれを検索しましたが、ios::cur の使用方法を理解できないようです。ファイル全体を 10 バイト単位で読み取り、それらのバイトをバッファーに書き込み、そのバッファーを別のファイルに書き込む必要があります。そのために、最初の 10 バイトを送信し、次に次の 10 バイトなどを送信します。しかし、ポインターが最後の反復の位置から開始するようにするにはどうすればよいですか?

char* data = 0;
int i = 0;
std::ifstream is("test.txt", std::ifstream::binary);

if (is)
{
    is.seekg(0, is.end);
    int size = is.tellg();

    cout << size << endl;

    ofstream obj;
    obj.open("new.txt");

    while (!is.eof())
    {
        for (; i <= size;)
        {
            is.seekg(i, is.beg);
            int sz = is.tellg();
            // cout<<sz<<endl;

            data = new char[sz + 1]; //  for the '\0'
            is.read(data, sz);

            data[sz] = '\0'; // set '\0' 
            cout << " data size: " << strlen(data) << "\n";
            cout << data;
            i = i + 10;
        }
        obj.close();
    }
}
4

2 に答える 2

2

ファイルの位置を変更する必要はありません。

ファイルの位置は、読み取り操作のたびに更新されます。

1 つは入力用、もう 1 つは出力用の 2 つのファイル オブジェクトを使用する必要があります。

どちらの場合も、読み取りおよび書き込み操作のたびにファイル位置が更新されます。

編集 1: 単純化された例

#define BUFFER_SIZE 16
unsigned char buffer[BUFFER_SIZE];
//...
while (input_file.read((char *)buffer, BUFFER_SIZE))
{
  output_file.write((char *)buffer, BUFFER_SIZE);
}

input_file の位置がオフセット 0 の場合、最初の読み取りの後、ファイルの位置は 16 になります。これは次の方法で確認できます。

int read_file_position = input_file.tellg();  
cout << "input file position: " << read_file_position << endl;
while (input_file.read((char *)buffer, BUFFER_SIZE))
{
  read_file_position = input_file.tellg();
  cout << "input file position: " << read_file_position << endl;
  output_file.write((char *)buffer, BUFFER_SIZE);
}
于 2013-11-14T18:44:23.073 に答える
1

次のように単純化できると思います。

char* data = 0;
int i = 0;
int size = 0;
int sz = 10;
std::ifstream is("test.txt", std::ifstream::binary);
std::ofstream obj;
data = new char[sz+1];
int read_sz = 0;

if (is)
{
    obj.open("new.txt");
    read_sz = is.tellg(); //we are at the beginning of the file now
    while (!is.eof())
    {
        int old_read_sz = read_sz; // old position - before next read
        is.read(data, sz);
        read_sz = is.tellg(); // new position, we've read read_sz-old_read_sz bytes
        data[read_sz-old_read_sz] = '\0'; // set '\0'
        // I hope you wanted the two lines below only for debugging purposes :)
        cout << " data size so far: " << read_sz << "\n";
        cout << data << endl;
        obj.write(data, read_sz-old_read_sz);
     }
    obj.close();
    is.close();
    cout << "total data size: "<< read_sz << endl;
}

データチャンクを読み取ったら、ファイルカーソルはすでにそのチャンクを通過しているため、自分で再配置する必要はありません(現在の位置から最後/最初に移動すると、時間的にコストがかかります-特に入力ファイルが大きい)。

ちなみに、このトピックに関するチュートリアルは次のとおりです。 http://www.cplusplus.com/doc/tutorial/files/

更新: is.read() != 古い C スタイルの読み取りを忘れていました :-}

于 2013-11-14T18:51:54.683 に答える