iteratorで最後の要素しか取り出せません – プログラミング – Home

iteratorで最後の要素しか取り出...
 
通知
すべてクリア

[解決済] iteratorで最後の要素しか取り出せません


sinn
 sinn
(@sinn)
ゲスト
結合: 25年前
投稿: 2
Topic starter  

基本的なことですいません。
ただいまC++の勉強中で、listクラスの練習をしています。

iterator.begin()が最初の要素のポインタを返してくれないようで、
以下のコードを実行しても、最後にReadFile()で
読んだデータを繰り返し出力しているようです。
iteratorの使い方が間違っているのでしょうか?

-----
#include stdafx.h
#include windows.h
#include <list>

const unsigned long BUFFER_SIZE = 65536;

using namespace std;
typedef list<unsigned char*> LISTCHARP;

int main(int argc, char* argv[])
{
char* filename;
HANDLE hinf;
HANDLE houtf;

unsigned char readdata[BUFFER_SIZE];
unsigned long filesize;
unsigned long buffersize;
unsigned long readsize;
unsigned long writtensize;

filename = E:\\Data\\test.txt;
hinf = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);
filename = E:\\Data\\copy.txt;
houtf = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);

filesize = GetFileSize(hinf, NULL);
printf(file size : %d\n, filesize);

LISTCHARP listcp;
LISTCHARP::iterator i;

int count = 1;
while (true)
{
if (filesize <= (count * BUFFER_SIZE))
buffersize = filesize - ((count - 1) * BUFFER_SIZE);
else
buffersize = BUFFER_SIZE;

ReadFile(hinf, readdata, buffersize, &readsize, NULL);
printf(read size : %d\n, readsize);

listcp.insert(listcp.end(), readdata);

if (filesize < (count * BUFFER_SIZE))
break;

count++;
}

count = 1;
for (i = listcp.begin(); i != listcp.end(); ++i, ++count)
{
if (filesize <= (count * BUFFER_SIZE))
buffersize = filesize - ((count - 1) * BUFFER_SIZE);
else
buffersize = BUFFER_SIZE;

WriteFile(houtf, *i, buffersize, &writtensize, 0);

printf(written size : %d\n, writtensize);
}

return 0;
}


引用未解決
トピックタグ
sinn
 sinn
(@sinn)
ゲスト
結合: 25年前
投稿: 2
Topic starter  

すいません。自分で気付きました。
ポインタをlist.insert()したのに、
そのポインタの指すデータを変更してました。


返信引用
HAL
 HAL
(@HAL)
ゲスト
結合: 25年前
投稿: 67
 

こんにちは。

せっかく勉強中ということですので、ヒントを。

コードを読んでみましたが、STLの構文などは間違って
いないと思います。問題になっているのはファイルから
読み込んだデータをLISTに追加する部分です。

ファイル読み込みのループを見ると、同じアドレスを
指すポインタをループ回数分、LISTに追加しています。

これで、何が問題かはわかりますよね?


返信引用
HAL
 HAL
(@HAL)
ゲスト
結合: 25年前
投稿: 67
 

あら、解決したんですね、おめでとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました