Обработка ошибок при открытии файла

[Вопрос 1]

Когда я открываю файл в функцию, обычно я делаю что-то вроде этого:

int read_file (char *filename)
{
    FILE *fin;

    if ( !(fin = fopen(filename, "r")) )
        return 1;

    /* ... */

    return fclose(fin);
}

int main ()
{
    char filename[100];

    if ( read_file(filename) )
    {
        perror(filename);
        exit(1);
    }

    return 0;
}

В общем-то0 возвращаемое значение для ошибок (верно?), тогда я могу изменить предыдущий код на:

int read_file (char *filename)
{
    FILE *fin;

    if ( !(fin = fopen(filename, "r")) )
        return 0;

    /* ... */

    return !fclose(fin);
}

int main ()
{
    char filename[100];

    if ( !read_file(filename) )
    {
        perror(filename);
        exit(1);
    }

    return 0;
}

Но я думаю, что первый код более чистый.

Другой вариант это только изменениеreturn 1; вreturn -1; (в первом коде, который я написал).

Какие'лучшая версия?

[Вопрос 2]

Если я должен обработать больше ошибок, это правильный код как этот?

int read_file (char *filename, int **vet)
{
    FILE *fin;

    if ( !(fin = fopen(filename, "r")) )
    {
        perror(filename);
        return 1;
    }

    * vet = malloc (10 * sizeof(int));
    if ( *vet == NULL )
    {
        perror("Memory allocation error.\n");
        return 1;   
    }

    /* ... */

    return fclose(fin);
}

int main ()
{
    char filename[100];
    int *vet;

    if ( read_file(filename, &vet) )
        exit(1);

    return 0;
}

Ответы на вопрос(1)

Ваш ответ на вопрос