VC++でCreateFile関数に渡すファイル名変数にファイル名をコンソールから入力したいがエラーになります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ロミオ

VC++でCreateFile関数に渡すファイル名変数にファイル名をコンソールから入力したいがエラーになります

#1

投稿記事 by ロミオ » 1年前

[1] 質問文
 [1.1] 自分が今行いたい事は何か
ファイル名を指定して、そのファイルの最終書き込み時間を表示するプログラムで、コンソールからファイル名を入力したい。

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
コンソールから
BuildLog.htm
C:\\Documents and Settings\\Owner\\My Documents\\Visual Studio Projects\\Win32SystemServicesPrograming\\GetFileTime\\Debug\\BuildLog.htm
C:/Documents and Settings/Owner/My Documents/Visual Studio Projects/Win32SystemServicesPrograming/GetFileTime/Debug/BuildLog.htm
C:\Documents and Settings\Owner\My Documents\Visual Studio Projects\Win32SystemServicesPrograming\GetFileTime\Debug\BuildLog.htm
を試しに入力してみた。また、コンソールから入力するのではなく、ファイル名変数にstrcpy関数でファイル名をコピーする方法も試した。

コード: 全て選択

#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#include <string.h>

void ShowTime(FILETIME t)
//時間tをstdoutに打ち出す
{
	FILETIME ft;
	SYSTEMTIME st;

	FileTimeToLocalFileTime(&t, &ft);
	FileTimeToSystemTime(&ft, &st);
	cout << st.wMonth << "/" << st.wDay << "/" << st.wYear << " " << st.wHour << ":" << st.wMinute << endl;
}

void main()
{
	HANDLE fileHandle;
	char filename[MAX_PATH];
	FILETIME create, lastWrite, lastAccess;
	BOOL success;

	//strcpy(filename, "C:\\Documents and Settings\\Owner\\My Documents\\Visual Studio Projects\\Win32SystemServicesPrograming\\GetFileTime\\Debug\\BuildLog.htm");	//←これだとうまくいく
	//ファイル名取得
	cout << "Enter filename: ";
	cin >> filename;			//←入力してもエラーになる

	//ファイルオープン
	fileHandle = CreateFile(filename, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
	if (fileHandle == INVALID_HANDLE_VALUE)
	{
		cout << "Error number " << GetLastError() << endl;
		getchar();
		getchar();
		return;
	}
	else
	{
		//ファイル時間取得
		success = GetFileTime( fileHandle, &create, &lastAccess, &lastWrite);
		cout << "Last write time: ";
		ShowTime(lastWrite);
		//他の2つはFATには無い
	}
	CloseHandle(fileHandle);

	getchar();
	getchar();
}
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
ファイル名をコンソールから入力したら
Error number 2
と表示される。エラーコードの意味は多分「The system cannot find the file specified. 」でシステムがファイルを見つけられないようだ。
strcpy(filename, "C:\\Documents and Settings\\Owner\\My Documents\\Visual Studio Projects\\Win32SystemServicesPrograming\\GetFileTime\\Debug\\BuildLog.htm");
↑のようにすればうまくいく。

 [1.4] 今何がわからないのか、知りたいのか
ファイル名をコンソールから入力して、うまくいく方法を知りたい。
[2] 環境  
 [2.1] OS : Windows XP(VMwareでシュミレーションされたもの)
 [2.2] コンパイラ名 : VC++ 2002

[3] その他
 ・どの程度C言語を理解しているか
基本的な文法を理解している
 ・ライブラリを使っている場合は何を使っているか

アバター
みけCAT
記事: 6003
登録日時: 7年前
住所: 千葉県
連絡を取る:

Re: VC++でCreateFile関数に渡すファイル名変数にファイル名をコンソールから入力したいがエラーになります

#2

投稿記事 by みけCAT » 1年前

>>で文字列を読み込むと、空白文字で読み込みが止まります。
1行読み込むには、basic_istream::getline関数を用いるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ロミオ

Re: VC++でCreateFile関数に渡すファイル名変数にファイル名をコンソールから入力したいがエラーになります

#3

投稿記事 by ロミオ » 1年前

>>>で文字列を読み込むと、空白文字で読み込みが止まります。
>1行読み込むには、basic_istream::getline関数を用いるといいでしょう。

なるほど、空白文字で読み込みが止まるわけですね。
次のコードでコンソールからの入力が可能になりました。

//strcpy(filename, "C:\\Documents and Settings\\Owner\\My Documents\\Visual Studio Projects\\Win32SystemServicesPrograming\\GetFileTime\\Debug\\BuildLog.htm"); //←これだとうまくいく
//ファイル名取得
cout << "Enter filename: ";
//cin >> filename; //←入力してもエラーになる
cin.getline(filename, MAX_PATH); // MAX_PATHの代わりに数字を指定してもよい(入力文字数より大きい数)

回答ありがとうございました。

返信

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