no entiendo por que en los fread() le pasas &ptr. ptr es un puntero a int, el cual no inicializas ya sea diciendole que apunte a alguna variable o reservandole memoria, y encima lo pasas por referencia con lo que a fread() le estas pasando la direccion de memoria del puntero
luego dentro del while tampoco entiendo cual es la finalidad de ptr=&ultimo, o directamente para que usas el puntero ptr. ademas, por cada caracter que lees, sumas 1 a "ultimo", cuando por cada linea deberias sumar 1. si la estructura del fichero siempre es 1 numero, 1 espacio, y luego una frase, podrias leer caracter por caracter, y si este es igual a '\n' sumar 1 a "ultimo".
ademas que abres el fichero 2 veces, podrias abrirlo solo 1 vez en modo lectura y escritura y con fseek() cuando lo necesites te situas al final de este.
en fin, que no me aclaro mucho con tu codigo... quizas soy yo asi que esperemos a que alguien mas conteste porque seguramente se me hayan pasado varias cosas.
un saludo!
edito: tenia ganas de programar algo y me puse con tu ejercicio. te dejo el code por si te sirve. este incluye la frase que se le pase por linea de comandos entre "" en el archivo con el numero que le toque al inicio.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
char fichero[]="prueba.txt", aux;
unsigned int num=0, i;
FILE *f;
//comprobaciones de error
if (argc != 2) {
printf("MODO DE USO: %s \"frase\"\n", argv
[0]); }
if (!(f
=fopen(fichero
, "r+"))) { printf("ERROR: No se pudo abrir %s.\n", fichero
); if (!(f
=fopen(fichero
, "w"))) { printf("ERROR: No se pudo crear %s.\n", fichero
); } else printf("Fichero %s creado.\n", fichero
); }
//lineas totales en el archivo
do {
i
=fread(&aux
, sizeof(char), 1, f
); if (aux == '\n') num++;
} while (i > 0);
if (num == 0) num++;
//escribimos el numero y la frase
fprintf(f
, "%u %s\n", num
, argv
[1]);
return 0;
}