C++ FindFirstFileの使い方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takumi@0832080.com
記事: 38
登録日時: 12年前

C++ FindFirstFileの使い方

#1

投稿記事 by takumi@0832080.com » 11年前

C++言語の話です.
【前提条件】 txt形式のファイルの中に1行づつフォルダへのパスが書いてあります.(例 /ap/tmp

以下簡易処理手順
1.テキスト読み込み (問題なし
2.そのフォルダのファイル一覧表示( ここで問題発生
プログラム自体は動作しますが,仮説と異なる,私の予想では,puts(ffd.cFileName);の所で文字を出力するはずなのですが・・・
何も出力してくれません.理由としてはFindFirstFileがINVALID_HANDLE_VALUE を返しているからということは分かっていますが・・・.;; さらにその原因分かる方お願いします.


以下に動くプログラムを載せます( 一応 構成プロパティの文字セットは マルチバイト文字セットにしてます.
(ただし実際に動作を試すのはフォルダを作ったりセッティングが面倒だと思いますのでやらないことを勧めます.

コード:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>

#include <string>
#include <iostream>
#include <fstream>
using namespace std;
/*ここまででインクルード等の処理*/

std::string Replace( std::string String1, std::string String2, std::string String3 ); /*機能は文字の置き換え*/

int main(int argc , char *argv[]) {
	WIN32_FIND_DATA ffd;
	/* 文字列宣言 */
	string folder;
	string str1 = "aaa";/* 適当なフォルダ名 */
	string str2 = "aaa111";/* 適当なフォルダ名 */

             /* 引数チェック処理 */
	if(argc < 2){
		printf("引数ERROR フォルダ名の記載された.txtをください");
		exit(1);
	}
              /* 指定されたテキストファイル読み込み */
	ifstream ifs(argv[1]);
	HANDLE h;
              /* テキストファイルを一行づつ読み込む  */
	while(ifs && getline(ifs,folder)) {

		folder = str1+folder;/* フォルダ名設定 */
		folder = Replace(folder,"/","\\");/* 文字をスラッシュを円マークに置き換える処理 */
		h = FindFirstFile(folder.c_str(), &ffd);/* ここで  INVALID_HANDLE_VALUE  を受け取ってしまう*/

		if ( h != INVALID_HANDLE_VALUE ) {
			do {
				puts(ffd.cFileName);/* ファイル一覧表示 */
			} while ( FindNextFile(h, &ffd) );
			FindClose(h);
		}

	}
	
}
/* 以下は本処理ではありません. */
std::string Replace( std::string String1, std::string String2, std::string String3 )
{
    std::string::size_type  Pos( String1.find( String2 ) );

    while( Pos != std::string::npos )
    {
        String1.replace( Pos, String2.length(), String3 );
        Pos = String1.find( String2, Pos + String3.length() );
    }

    return String1;
}
最後に編集したユーザー takumi@0832080.com on 2012年11月19日(月) 20:40 [ 編集 1 回目 ]

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: C++ FindFirstFileの使い方

#2

投稿記事 by YuO » 11年前

Win32 APIが失敗したならば,まずはGetLastError APIを呼び出して,エラーコードを取得する必要があります。
# 他の方法でエラー原因を通知したり,エラー原因の取得が出来ないAPIもありますが。

次に,ブレイクポイントやウオッチを使って,デバッグします。
大抵は,その時点でデータがおかしいはずです。そのおかしい原因をさらに探ります。

コードを見る限り,データファイルかstr1の実際の設定値がおかしいのではないか,という気がしますが……。

takumi@0832080.com
記事: 38
登録日時: 12年前

Re: C++ FindFirstFileの使い方

#3

投稿記事 by takumi@0832080.com » 11年前

YuO さんが書きました:Win32 APIが失敗したならば,まずはGetLastError APIを呼び出して,エラーコードを取得する必要があります。
# 他の方法でエラー原因を通知したり,エラー原因の取得が出来ないAPIもありますが。

次に,ブレイクポイントやウオッチを使って,デバッグします。
大抵は,その時点でデータがおかしいはずです。そのおかしい原因をさらに探ります。

コードを見る限り,データファイルかstr1の実際の設定値がおかしいのではないか,という気がしますが……。

設定値がおかしかったです.具体的にはPATHの初めには円マークが必要なのに抜けてました^^;
解決しました.迅速な回答有難うございました.

閉鎖

“C言語何でも質問掲示板” へ戻る