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;
}
Foi útil?

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

claro para repor o estado antes da chamada para aberto.

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top