...
int main()
{
.
.
.
if(pf = fopen(nombre, "a+b") == NULL)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Как указано в ответе @ wildplasser (+1), ваша первая проблема находится в строке выше.
Это должно быть:
if((pf = fopen(nombre, "a+b")) == NULL)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
НазначаетFILE * to pf и ТОГДА проверяет, имеет ли он значение NULL
То, как оно у вас изначально, а именно:
if(pf = fopen(nombre, "a+b") == NULL) /* wrong */
вы устанавливаете pf как результат `fopen (nombre,"a + b") == NULL, который будет либо 0, если логическое выражение (==) равно FALSE, либо! 0 (обычно 1), если оно истинно.Таким образом, pf имеет результат boolean, а НЕ фактический указатель файла.Это также вызывает проблемы с if, конечно, потому что теперь он смотрит на pf.
pf = fopen(nomber, "a+b") == NULL; /* here to clarify == happens before = */
if ( pf ) /* i.e. pf != 0 */