複数のファイルを開いて、1つのファイルにまとめたい!

[戻る]
えんどう [E-Mail] 2005/06/21(火) 16:41:02
タイトルの質問が全てなのですが、
うまくいきません。
以下がその一例です。

CFile A[10];

char  file_name[10] = "a","b","c",...

  for(i=0;i<10;i++){
     CString pFileName = file_name[i];
     A[i].Open(pFileName,CFile::modeRead|CFile::shareExclusive );
     A[i].Seek( 100, CFile::begin );
  }

プログラムの一部なのですが、
for分を使って、複数のファイルを同時に開き、ポインタを保存しながら、
ひとつのファイルにまとめていくという処理をしたいのです。

しかし、OPENまではできるのですが、Seekでエラーが発生してしまいます。

CFileの宣言を1つずつ行えば、できるのは当たり前だと思うのですが、
同じ処理を繰り返し行いたい為に、上記のような使い方をしたかったのです。

なにか、よい方法はないでしょうか???

Blue 2005/06/21(火) 16:56:44
>char  file_name[10] = "a","b","c",...
この意図は何でしょうか?(コンパイルエラーだと思うけど)
char* file_name[10]ではないのですか?
(どうせなら CString file_name[10] でいいとおもう。)

>A[i].Open(pFileName,CFile::modeRead|CFile::shareExclusive );
オープンに失敗しているとは限りませんか?戻り値を確認してみては?

Blue 2005/06/21(火) 17:16:30
CFile::Seekの説明をみたところ

CFile::begin   ファイル ポインタをファイルの先頭から lOff バイト前方に移動しま
す。
とあります。開いたばかりで前方に移動するのでしょうか?
ちなみに
SeekはCFileExceptionを投げますので try〜catch でつかまえてみては。

>for分を使って、複数のファイルを同時に開き、ポインタを保存しながら、
>ひとつのファイルにまとめていくという処理をしたいのです。
Seekは移動するだけでデータ内容を保存しません。
どのようにして
 ポインタを保存しながら、ひとつのファイルにまとめていく
のですか?
(Readで読み込んでいくのではないのでしょうか?)

えんどう [E-Mail] 2005/06/21(火) 17:24:35
早速のレスありがとうございます。

char  file_name[10] = "a","b","c",...

の部分は、CString file_name[10]の間違いでした。

Openの戻り値を確認してみたんですが、0を返してきました。
ということは、失敗しているのですね・・・。
Seekはできるはずなかったです 涙

やはり、CFileの宣言がまずいと言うことなのでしょうか?

えんどう [E-Mail] 2005/06/21(火) 17:28:19
>どのようにして
> ポインタを保存しながら、ひとつのファイルにまとめていく
>のですか?
>(Readで読み込んでいくのではないのでしょうか?)

と言う件ですが、Readで読み込んだ後、Writeで書き込みしています。
Seekでエラーが出ていたもので、省略していました・・・。

すいませんでした。

Blue 2005/06/21(火) 17:48:19
そもそもCFileを配列で持たないでいいのでは?
一回のReadで読み終わったらCloseするのですよね?
書き込み用のCFileオブジェクトと読込みようのCFileオブジェクトの1つずつでOKなき
も。

とりあえずOpenの第3引き数にCFileExcetionの変数を設定して、
ナニが原因か探ってみてはどうでしょうか?

あのぉ。 2005/06/21(火) 17:59:19
変な回答で申し訳ないけど・・・

10回ファイル開くなら・・・
system("copy a.dat + b.dat + c.dat・・・・x.dat n.Dat");
これじゃお話になりませんかね?
単純にくっつけるだけなら・・・と思ったのですが。

趣旨とはズレてるかも知れませんが、素人が無い頭絞って
考えてみました。お邪魔ならごめんなさい。

えんどう [E-Mail] 2005/06/21(火) 19:19:22
>blueさん
Open時のエラーは
CFileException::sharingViolation SHARE.EXE 未ロードまたは共有領域ロック済み

というものでした。

これはどういうエラーなのでしょうか?
MSDNの説明では、ぴんとこないもので。。。


>そもそもCFileを配列で持たないでいいのでは?
>一回のReadで読み終わったらCloseするのですよね?
>書き込み用のCFileオブジェクトと読込みようのCFileオブジェクトの1つずつでOKな
>きも。

またまた、字足らずでしたが、
一度開いたファイルは再び使用し、読み込んだポインタの位置から、
再び読み込むという処理にしたいのです。

確かに、Open&Closeを繰り返えし、ポインタを保存しておけばできることなのですが、
大き目のファイル開くつもりですので、何回も同じopen,close,read,seekを使うと、
処理が遅くなるという懸念材料がありまして・・・。

拡張性を考えて、for文を使用するということを考えました。


タイトルがいまいちでした。

複数のファイルを同時に開いて、
1.ある部分まで読み込み&別ファイルに書き込み!
2.別のファイルの読み込み&別ファイルに書き込み!
3.1,2の繰り返し。

です。



>あのぉさん
わざわざレスありがとうございます。

Blue 2005/06/21(火) 23:08:51
>CFileException::sharingViolation SHARE.EXE 未ロードまたは共有領域ロック済み
すでにファイルを排他モードで開いているということはないでしょうか?
私も詳しくはわかりませんが。。。

CFile::Seekを行うのはなんか理由があるのでしょうか?
Readで120バイト読み込んで100バイト前にSeekするとか?

読み込むファイルのサイズがそれぞれ違うと結構面倒な処理をしないといけないかも。

R2 2005/06/22(水) 00:40:17
open したファイルを close せずにまた open しようとしているとか?

えんどう [E-Mail] 2005/06/22(水) 10:12:38
[[解決]]
解決いたしました。

ご指摘どおり、ファイルの二重オープンでした。
初歩的なミスでした。

CFileの配列宣言は、できるようです。

レスしていた方々には、大変ご迷惑をおかけいたしました。

CFile::Seekの件ですが、
MSDNには「前方」と言う表現がありましたが、
試した結果、ファイルの先頭から、指定した位置にポインタを
移動させることができました。

前方というのは、どういうことなんでしょうか・・・?
不思議。

Blue 2005/06/22(水) 11:22:50
>前方というのは、どういうことなんでしょうか・・・?
私の日本語の解釈がダメでした。

MSDNを再度確認したところ

CFile::begin   Move the file pointer lOff bytes forward from 
               the beginning of the file. 

とありました。
ファイルの先頭から指定の位置までファイルポインタを進めるということで、
前方という表現は現在の位置より先に進めるということでした。

困惑させてすみませんでした。orz

えんどう [E-Mail] 2005/06/22(水) 12:09:03
いえいえ。

こちらこそ、ありがとうございました。

古いスレッドには追加発言できません。