複数のファイルを開いて、1つのファイルにまとめたい! – プログラミング – Home

複数のファイルを開いて、1つのファイル...
 
通知
すべてクリア

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


えんどう
 えんどう
(@えんどう)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

タイトルの質問が全てなのですが、
うまくいきません。
以下がその一例です。

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

CFile::Seekの説明をみたところ

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

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


返信引用
えんどう
 えんどう
(@えんどう)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

早速のレスありがとうございます。

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

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

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

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


返信引用
えんどう
 えんどう
(@えんどう)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

>どのようにして
> ポインタを保存しながら、ひとつのファイルにまとめていく
>のですか?
>(Readで読み込んでいくのではないのでしょうか?)

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

すいませんでした。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

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


返信引用
あのぉ。
 あのぉ。
(@あのぉ。)
ゲスト
結合: 19年前
投稿: 1
 

変な回答で申し訳ないけど・・・

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

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


返信引用
えんどう
 えんどう
(@えんどう)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

>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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

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

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


返信引用
R2
 R2
(@R2)
ゲスト
結合: 19年前
投稿: 3
 

open したファイルを close せずにまた open しようとしているとか?


返信引用
えんどう
 えんどう
(@えんどう)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

解決いたしました。

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

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

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

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>前方というのは、どういうことなんでしょうか・・・?
私の日本語の解釈がダメでした。

MSDNを再度確認したところ

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

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

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


返信引用
えんどう
 えんどう
(@えんどう)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

いえいえ。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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