(закрыто) stat: всегда проверять возвращение функции - PullRequest
0 голосов
/ 09 сентября 2018

когда я строю строку

string s ="";
s = rb.rep + a.chemin.substr(rep.size());
//cout << "s:" << s << endl;

if (s.empty()){
    cerr<<"c++ string is uninitialized"<<endl;
    exit(1);
}

и делает

if(is_file(s)){
    a.s="ok";
}
else{
      SEULS.push_back(ela.first);
      a.s="SEUL";
}

с этой функцией:

bool is_file(string &path) {

структура определена

    struct stat buf;
    stat(path.c_str(), &buf);

вы знаете, если это файл или нет

    if(S_ISREG(buf.st_mode)) cout<<"is_file "<<path<<"  "<<S_ISREG(buf.st_mode)<<endl;
    else cout<<"NO is_file "<<path<<"  "<<S_ISREG(buf.st_mode)<<endl

другой способ пытается открыть файл

    FILE*f=fopen(path.c_str(), "r");
    if( f == NULL){
        cerr<<"PROB fopen "<<path<<endl;
        exit (EXIT_FAILURE);
    }
    else{
        fclose(f);
    }

результат возвращается

    return S_ISREG(buf.st_mode);
}

Я получил этот результат на консоли

is_file e / rep_A / 1.txt 1
НЕТ is_file e / 2.txt 0
PROB fopen e / 2.txt
Программа завершилась с кодом выхода: 1

но когда я комментирую

//    FILE*f=fopen(path.c_str(), "r");
//    if( f == NULL){
//        cerr<<"PROB fopen "<<path<<endl;
//        exit (EXIT_FAILURE);
//    }
//    else{
//        fclose(f);
//    }

Я получил

is_file e / 2.txt 1
is_file e / rep_B / 3.txt 1
LesSeuls de e et de a ...
is_file a / rep_A / 1.txt 1
is_file a / rep_B / 3.txt 1

ПРОБЛЕМА:

e / 2.txt не существует !!

и если я раскомментирую

cout << "s:" << s << endl;

перед звонком

if(is_file(s)){
    a.s="ok";
}
else{

Это нормально!

Я получаю

НЕТ is_file e / 2.txt 0
PROB fopen e / 2.txt
Программа завершилась с кодом выхода: 1

В результате я должен напечатать строку s или напечатать что-нибудь, чтобы получить хорошую строку s. это как параллельное программирование.

Это не шутка

Вы с этим встречались?

Спасибо

1 Ответ

0 голосов
/ 09 сентября 2018

Если файл не существует, stat завершится ошибкой (с ошибкой ENOENT), оставив его параметр struct stat без изменений. Ваша программа не проверяет возвращаемое значение stat call; даже если вызов не удался, программа с радостью приступает к проверке случайного мусора, оставленного в стеке предыдущими функциями.

Вот почему поведение программы меняется в зависимости от того, что вы делаете перед вызовом stat - вы просто наблюдаете различные наборы мусора.

...