Потому что нормальный алгоритм работы с мелкими текстовиками следующий:
открыть файл на чтение (man open - внимание, не потоковый fopen, а простой open!)
получить размер файла из элемента оглавления каталога (man stat)
выделить память размером с файл (man calloc)
прочитать
весь файл целиком (man read)
закрыть файл (man close)
и после этого парсить полученный буфер как угодно вдоль и поперек, не забывая конечно, что портить его не надо :)
Ну или вот так наверно понятнее будет:
#define NUL 0
#define ERR -1
int i;
short int handle;
struct stat sb;
char *name="/tmp/testfile.txt";
char *data;
if ((handle = open(name, O_RDONLY)) < NUL)
return ERR;
stat(name, &sb);
data = (char *) сalloc(sb.st_size + 1);
i = read(handle, data, sb.st_size);
close(handle);
На выходе - массив data с данными файла.
Ищещь перевод строки ('\n') и переставляешь указатель
ЗА него (если нужно конвертить число в цифру то после перестановки на место перевода строки пишешь '\0' и используешь atoi() - на выходе длина строки, которая идет в качестве контроля, чтобы на SIGSEGV случайно не выскочить.
Потом от нового положения указателя цикл по длине строки с поиском по таблице замен.
Вот блин...ведь мамой клялся, что подсказывать не буду...