ファイルの総変換のプログラムの作り方、忘れたな

[戻る]
ファイルの変換のし方、忘れた 2010/06/13(日) 11:12:15
いちいち、ファイル名を指定させながら、1つづつ
ファイル変換の作業をやらせるのが嫌なので、

プログラムがあるのと同一の、1つのディレクトリの中に、
同じ.rtfなら.rtfと付いているファイル全部を、
また、.txtなら.txtのファイル全部を
発見して、
(何の拡張子のものを探させるかは、
 scanfで指定してもらおうかと)
それぞれ見つけたものに関して、
fopenでファイルを開いて、
同じ手法で一定のファイル変換をさせて、
fcloseしながら、
同じ拡張子のファイル全部に対して
同様の作業をして、
包括的にファイル変換を終えさせようとしています。

これをやる時、
findfilenameだったか、findfirstrfile
だったか、それらを使うんじゃなかったかなあ、
というのは覚えていますが、
使ったことがないのと、
どうやるのかわからないので、
ご存じの方、お教えいただけますか?

要は、同じ拡張子でくくれる分、全部まとめて、
ファイル変換をさせたいのです。

επιστημη [E-Mail] [HomePage] 2010/06/13(日) 16:19:13
FindFirstFile / FindNExtFile / FindClose 使います。

http://msdn.microsoft.com/ja-jp/library/cc429233.aspx
http://msdn.microsoft.com/ja-jp/library/cc429242.aspx
http://msdn.microsoft.com/ja-jp/library/cc429224.aspx

// *.cpp を列挙するサンプル

#include <iostream>
#include <Windows.h>

using namespace std;

int main() {
  WIN32_FIND_DATA fd;
  HANDLE handle = FindFirstFile("*.cpp", &fd);
  if ( handle != INVALID_HANDLE_VALUE ) {
    do {
      cout << fd.cFileName << endl;
    } while ( FindNextFile(handle, &fd) );
    FindClose(handle);
  }
}

ファイルの変換のし方、忘れた 2010/06/13(日) 19:30:27
ありがとうございます。

基本的なことを聴かせてください。
cout << fd.cFileName << endl
というところは、
一体何をやっているのでしょうか?

ファイルの変換のし方、忘れた 2010/06/13(日) 20:47:57
あと、もう一つ、お聴きしたいことは、
HANDLE handle = FindFirstFile("*.rtf", &fd);
とした場合は、
そこのディレクトリーにある
XXXX.rtf
YYY.rtf
ZZZZZZ.rtf
等を順次開いていくと思いますが、
そこの
XXXX
とか
YYY
や
ZZZZZ
の部分も読んで来ることも出来ますか?
その名前を見て、
別なファイル名
例えば
XXXX_Out.rtf
YYY_Out.rtf
ZZZZZZ_Out.rtf
等の名前で、
フォアマットを変換されたものを保存したいのです。

επιστημη [E-Mail] [HomePage] 2010/06/13(日) 23:02:41
> cout << fd.cFileName << endl
> というところは、
> 一体何をやっているのでしょうか?

プリントしてるだけ。

> XXXX
> とか
> YYY
> や
> ZZZZZ
> の部分も読んで来ることも出来ますか?

そんなもん、得られたファイル名のケツを切り落とせばいいっしょ。

PATIO 2010/06/14(月) 13:05:17
せめて、言語は何を使って作りたいのかとか
ちゃんと提示すべきではないかと思いますが。

どうもC++言語の知識が怪しいみたいなので
C言語で作りたいのかなと想像していたりしますが。

ファイルの変換のし方、忘れた 2010/06/17(木) 08:41:02
皆様。
アドバイスありがとうございます。
私は
ボーランドのbcc32でやっています。

上記のコードをそっくりそのまま移植して
やってみました。
お陰様で、変換ファイルは、
指定のファイル名、希望のフォーマット通りできましたが、
元のファイル側が、
形骸的には残っているものの、
容量0のものに化けてしまいました
(消えたのと同じ)。
それぞれのファイルの開きは、
いつも通り、
今まで(単独のファイル変換で)は、
絶対問題の起こらなかった
fopenの+rbモード
(ふつうのrbモードでやると、
逆に、途中でメモリに書き込めず、のエラーが。。。
えー!命令を出していないのに、
書きに行っている?!)
でやっており、
コード上、見る限りは、
不用意にリード側に
fputしたと言うことは、
ありません。
このFindFile何とかの命令郡を使うと、
こう言ったことが
起きるものなのでしょうか?
ファイルが
思いどおりに
変わったのはいいのですが、
元のファイル自身が
壊されるのが嫌なので、
何らかの対策を打ちたいのですが、
どうすればいいでしょうか?

よろしく、お願いします。

PATIO 2010/06/17(木) 11:56:59
取り合えず、実際のコードをさらした方が良いような気がします。

全部を出すと量が多いという話なら現象が再現する最低限のコードを
提示するのがベストでしょう。
もしかしたらその最小限のコードを探っている内に何かわかるかも
しれませんけれど。

bccは持っていないのでMSDNで確認していますけれど、
"r+"モードに関しては既存のファイルを破壊するとは書かれていない
ので通常なら元のファイルが破壊される事は無いと思います。
プログラムに問題があるからそうなっていると考えた方が良いと思います。

ryo 2010/06/17(木) 12:11:46
×:忘れたな
○:元々詳しく知らなかった

×:bcc
○:ここはVC++の掲示板

×:単独ならできたのだから複数でも問題ないはず、悪いのは他人のコードか関数だ
○:自分を疑え

上記に提示されているコードは、「ファイル名を列挙する」だけでファイル操作はしてい
ない。
「上記のコードをそっくりそのまま移植して」るなら、ここに原因がある可能性はない
(というか、すでにご自分のコードと混ぜているのだから、そっくりそのままなんてのは
嘘)

そもそも、書き込みしてないのに、書き込みエラーがでるようなソースを
ファイルオープン時のモードで(なぜか?)回避できているようなソースは信用できない

επιστημη [E-Mail] [HomePage] 2010/06/17(木) 21:40:07
これは手厳しいwww
いや、そのとーりなんすけど。

ITO 2010/06/18(金) 14:45:32
うーーん、
ryoさんの意見、ごもっともですが、
> ×:忘れたな
> ○:元々詳しく知らなかった
> FindFirstFile / FindNExtFile / FindClose 使います。
> http://msdn.microsoft.com/ja-jp/library/cc429233.aspx
> http://msdn.microsoft.com/ja-jp/library/cc429242.aspx
> http://msdn.microsoft.com/ja-jp/library/cc429224.aspx
サンプルをいきなりそのまま実行するのではなく、
まず掲示してもらったサイトをよく見て理解した上で、サンプルを実行したらどうでし
ょうか?

> ×:bcc
> ○:ここはVC++の掲示板
「bccを使っているので、SDKでお願いします。」
なら回答者も納得するのでは?

>×:単独ならできたのだから複数でも問題ないはず、悪いのは他人のコードか関数だ
>○:自分を疑え
そうですね、
あと、掲示してもらったコードを疑うのなら、相手が納得するだけの理由をしっかり
書かないと駄目ですね。

FindFirstFile / FindNExtFile / FindClose を使うのなら、
僕は、CleateFile等を使いますね。

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