合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ロミオ
[URL]
Date: 2017年4月17日(月) 23:48
No: 1
(OFFLINE)

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

[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関数でファイル名をコピーする方法も試した。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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言語を理解しているか
基本的な文法を理解している
 ・ライブラリを使っている場合は何を使っているか

Name: みけCAT
[URL]
伝説なるハッカー(665,992 ポイント)
Date: 2017年4月18日(火) 01:47
No: 2
(ONLINE)

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

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

Name: ロミオ
[URL]
Date: 2017年4月18日(火) 10:36
No: 3
(OFFLINE)

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

[解決!]

>>>で文字列を読み込むと、空白文字で読み込みが止まります。
>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の代わりに数字を指定してもよい(入力文字数より大きい数)

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[5人]