2013-12-10 78 views
0

我不知道,如果它的相關性,但我使用的是Windows 7和Microsoft Visual Studio 2010c。如果文件存在,如果是,改變輸出

所有我想做的事情,就是要求用戶輸入文件名,檢查是否存在該名稱的文件存在,但它確實存在,請他們爲不同的一個

我嘗試

Main.cpp的

std::cout << std::endl << "You must create a username" << std::endl; 
std::cin >> username; 
user.checkFile(username); 

User.cpp

void User::checkFile(std::string &username) 
{ 

std::ifstream fin (username + ".txt"); 
    while (fin.good) 
    { 
    std::cout << "This username already exists, please choose another."; 
    std::cin >> username; 
    if (fin.bad) 
     { 
      break; 
      fin.close(); 
     } 
    } 
} 

這是否存在該名稱的文件存在,但後來甚至當我鍵入一個不存在的名字,但它仍然告訴我正確地識別它確實存在

+1

首先, 「好」和「壞」是功能。其次,你通常可以檢查'fin'。最後,它並沒有處於不良狀態,因爲如果它存在,該文件只是打開閱讀。如果不是,則創建並打開它。 – chris

+0

加上break後的調用fin.close()是毫無意義的 - 這段代碼永遠不會到達 –

+0

@chris:IIRC,'std :: ios_base :: in'將* not *在'std :: ifstream'上創建一個文件不存在。 –

回答

1

Main.cpp的

std::cout << std::endl << "You must create a username" << std::endl; 
do 
{ 
    std::cin >> username; 
    if (user.checkFile(username)) 
     break; 
    std::cout << "This username already exists, please choose another." << std::endl; 
} 
while (true); 

User.cpp

bool User::checkFile(const std::string &username) 
{ 
    FILE *fin = fopen((username + ".txt").c_str(), "r"); 
    if (fin) 
    { 
     fclose(fin); 
     return false; 
    } 
    return true; 
} 
-1

我認爲你需要使用c_str()函數來轉換你的字符串。例如:

string a="df"; 
a.c_str(); // will return c string 
+0

在用戶最可能使用的C++ 11中不需要。 – 0x499602D2

1

我會使用簡單的C函數進行文件處理。

void User::checkFile(std::string &username) 
{ 
    std::string username2 = username + ".txt"; 
    FILE * f = fopen(username2.c_str(), "r"); 
    while (f != NULL) 
    { 
     fclose(f); 

     std::cout << "This username already exists, please choose another."; 
     std::cin >> username; 
     std::string username2 = username + ".txt"; 
     f = fopen(username2.c_str(), "r");   
    } 
} 

這樣,YOUT變量username將持有有效的名稱,在函數返回CAL,因爲您是通過引用傳遞它。

+0

輝煌,工作正常(在我關閉了函數的第二行的*和f之間的差距) – user3001499

+0

葉..對不起,我錯過了分號 –

0

輸入新的字符串後,您需要重新打開該文件與該名:

std::cout << "This username already exists, please choose another."; 
std::cin >> username; 

fin.close(); 
fin.open(username); 

此外,goodbad是必須使用電話運營商()中調用的函數。

1
int main(void) { 

    bool fileExists = true; 

    while (fileExists) 
    { 
      string fileName; 
      cout << "Enter file name: "; 
      cin >> fileName; 

      ifstream ifs(fileName.c_str()); 

      fileExists = !ifs.good(); 
    } 

    return 0; 
} 
+0

我會使用'do/while'循環來代替。不需要'fileExists'變量。 –

+0

@RemyLebeau:你仍然需要在循環之外的變量來測試條件。如果你將'ifs'移出循環以檢查它是否處於終止狀態,那麼你需要做額外的工作來正確地打開/關閉它。哪個不理想。使用'filesExists'外部(作爲一個簡單的布爾)while循環很好很容易。 –

+0

@LokiAstari:不,你不需要一個外部變量。如果找不到該文件,請輸入「do」和「break」循環。 'do {ifstream ifs(filename); if(!ifs)break; } while(true);' –

1

如果你限制自己只是 Windows中,有一個API函數正是這麼做的:PathFileExists

如果你想堅持的標準庫,你可以做到以下幾點:

string filename; 
cin >> filename; 
ifstream fin(filename); 
if (fin.is_open()) 
{ 
    // file opened successfully 
} 
else 
{ 
    // file did not open 
} 
+1

對於更接近標準的東西,Boost的文件系統庫有它。如果使用MSVC,即將成爲標準的''頭已經在那裏。 – chris

+0

@chris:的確,我差點忘了那個圖書館:) –

相關問題