Alertando o usuário para o nome do arquivo ou diretório
Pergunta
Estou pedindo ao usuário um nome de arquivo, se eles entram em um nome de arquivo válido pela primeira vez, ele funciona. No entanto, se a sua inválido pela primeira vez, todos os outros verificação falhar. Como eu poderia corrigir isso? Além disso, vamos dizer que eles apenas especificar um diretório, como eu ia obter os nomes de todos os arquivos de texto e quantas existem?
int main() {
ifstream inFile;
int result;
string filename;
cout << "If the executable is not in the same directory as the\nfile, then a directory needs to be provided\n\n";
while (true) {
cout << "Enter the file name: ";
getline(cin, filename);
inFile.open(filename.c_str(), ios::in);
if (!inFile)
cout << "\n**File failed to open**\n\n";
else break;
}
result = countLOC(inFile);
cout << "\nThere are " << result << " lines of code in \"" << filename << "\"\n\n";
inFile.close();
return 0;
}
Solução
Isto é porque os bits de erro no objeto 'INFILE' foram definidas.
Você precisa redefinir os bits de erro antes de fazer qualquer outra coisa.
if (!inFile)
{
cout << "\n**File failed to open**\n\n";
inFile.clear();
}
else break;
Outras dicas
Você não precisa realmente de fazer uso dos sinalizadores de erro etc, você pode simplesmente chamar a função inFile.is_open () para conferir. Você não vai precisar usar inFile.clear () também.
Sim fazer uma clara
Se o usuário fornece um diretório que você precisa fazer FindFirst e FindNext
msdn.microsoft.com/en-us/library/zyzxfzac (VS.71) aspx
e processar todos os arquivos dessa forma.
limpá-la. Além disso, você não precisa a ruptura em seu loop, eu iria sugerir este em vez disso:
do {
if (infile.fail())
cout << "\n**File failed to open**\n\n";
infile.clear()
cout << "Enter the file name: ";
getline(cin, filename);
inFile.open(filename.c_str(), ios::in);
} while(!infile)