1 Востаннє редагувалося shabaranskij (09.07.2016 20:46:10)

Тема: Стандартні бібліотеки С.

Як правильно

#include <stdio.h>
#include <assert.h>

int main ()
{
    FILE *fd;

    fd = fopen ("/home/sashko/file.txt", "r");
    assert (fd != NULL);

    fclose (fd);

    return 0;
}

чи так

#include <stdio.h>
#include <assert.h>

int main (void)
{
    FILE *fd;

    fd = fopen ("/home/user/file.txt", "r");
    assert (fd);
    fclose (fd);

    return 0;
}

ці приклади знайшов у вікіпедії.
Перший приклад в українській версії а другий в рос.

2 Востаннє редагувалося leofun01 (09.07.2016 21:03:56)

Re: Стандартні бібліотеки С.

Другий варіант мені більше подобається, бо в першому

assert(fd != NULL);

нема потреби порівнювати fd і NULL, при перетворенні значення fd в bool в стрічці

assert(fd);

fd буде давати true, якщо не дорівнює NULL.

І "/home/sashko/file.txt" мені якось кидається в очі.

І ще main() проти main(void). Краще явно вказувати відсутність вхідних параметрів. Я за void.

А в іншому наведені приклади - однакові.

Подякували: shabaranskij1

3

Re: Стандартні бібліотеки С.

sashko чи user - це, вибачте, залежить від конкретної системи. Мені не подобаються обидва варіанти, надто вже прив'язка встановлюється. Краще просто "file.txt", а там нехай вже з поточного каталогу файл бере.
main() і main(void) - синоніми в C (хоча явний варіант мені подобається більше), але в C++ перше означає довільну кількість довільних параметрів, що не є добрим. Втім, main все одно за стандартом викликати не можна, так що це лишається питанням смаку.
Що ж до третього, то явний варіант assert(fd != NULL); кращий. Якщо у вас буде п'ять assert-ів поспіль, і 4 перевірятимуть результати розрахунків, а п'ятий - файл, то ви не переплутаєте, хто з них який.

Подякували: leofun01, shabaranskij2

4

Re: Стандартні бібліотеки С.

#include <stdio.h>
#include <assert.h>

main ()
{
    FILE *file;

    file = fopen ("file.txt", "r");
    assert (file);

    fclose (file);
}

Думаю так буде норм.

5

Re: Стандартні бібліотеки С.

А тепер скомпілюйте з NDEBUG і шляхом до неіснуючого файлу - не думаю що результат вас задовольнить.
assert треба використовувати для перевірок помилок програміста, тобто внутрішньої незалежної від вхідних даних логіки (хороший приклад - перевірка вказівників-параметрів функції на != NULL).
В цьому випадку варто би явно перевірити чи відкрився файл і явно зреагувати, хоч і тою самою панікою

6

Re: Стандартні бібліотеки С.

0x9111A написав:

А тепер скомпілюйте з NDEBUG і шляхом до неіснуючого файлу - не думаю що результат вас задовольнить.
assert треба використовувати для перевірок помилок програміста, тобто внутрішньої незалежної від вхідних даних логіки (хороший приклад - перевірка вказівників-параметрів функції на != NULL).
В цьому випадку варто би явно перевірити чи відкрився файл і явно зреагувати, хоч і тою самою панікою

Я не збирався використовувати assert в такий спосіб. Зараз вивчаю С і вирішив розібратися із стандартними бібліотеками. Це я пробував розібратися як вона працює. Вже зрозумів. Сюди я буду писати якщо в мене виникнуть питання що до інших бібліотек.

7

Re: Стандартні бібліотеки С.

0x9111A написав:

А тепер скомпілюйте з NDEBUG і шляхом до неіснуючого файлу - не думаю що результат вас задовольнить.
assert треба використовувати для перевірок помилок програміста, тобто внутрішньої незалежної від вхідних даних логіки (хороший приклад - перевірка вказівників-параметрів функції на != NULL).
В цьому випадку варто би явно перевірити чи відкрився файл і явно зреагувати, хоч і тою самою панікою

А ніц не станеться - бо з файлу ніхто не читає, а fclose у випадку помилки просто повертає EOF.
Хоча ваша правда - дивне використання assert.

Подякували: 0x9111A, shabaranskij2