Язык программирования Си


         

Переделайте эту программу, чтобы название


- 161 - Си в UNIX

4.37. Найдите ошибку в программе (программа распечатывает корневой каталог в "ста- ром" формате каталогов - с фиксированной длиной имен):

#include <stdio.h> #include <sys/types.h> #include <sys/dir.h>

main(){ FILE *fp; struct direct d; char buf[DIRSIZ+1]; buf[DIRSIZ] = '\0';

fp = fopen( '/', "r" ); while( fread( &d, sizeof d, 1, fp) == 1 ){ if( !d.d_ino ) continue; /* файл стерт */ strncpy( buf, d.d_name, DIRSIZ); printf( "%s\n", buf ); } fclose(fp); }

Указание: смотри в fopen(). Внимательнее к строкам и символам! '/' и "/" - это совершенно разные вещи (хотя синтаксической ошибки нет!). Переделайте эту программу, чтобы название каталога поступало из аргументов main

(а если название не задано - используйте текущий каталог ".").

4.38. Функциями

fputs( строка, fp); printf( формат, ...); fprintf(fp, формат, ...);

невозможно вывести строку формат, содержащую в середине байт '\0', поскольку он слу- жит для них признаком конца строки. Однако такой байт может понадобиться в файле, если мы формируем некоторые нетекстовые данные, например управляющую последователь- ность переключения шрифтов для принтера. Как быть? Есть много вариантов решения. Пусть мы хотим выдать в канал fp последовательность из 4х байт "\033e\0\5". Мы можем сделать это посимвольно:

putc('\033',fp); putc('e', fp); putc('\000',fp); putc('\005',fp);

(можно просто в цикле), либо использовать один из способов:

fprintf( fp, "\033e%c\5", '\0'); write ( fileno(fp), "\033e\0\5", 4 ); fwrite ( "\033e\0\5", sizeof(char), 4, fp);

где 4 - количество выводимых байтов.

4.39. Напишите функции для "быстрого доступа" к строкам файла. Идея такова: сначала прочитать весь файл от начала до конца и смещения начал строк (адреса по файлу) запомнить в массив чисел типа long (точнее, off_t), используя функции fgets() и ftell(). Для быстрого чтения n-ой строки используйте функции fseek() и fgets().

#include <stdio.h> #define MAXLINES 2000 /* Максим. число строк в файле*/ FILE *fp; /* Указатель на файл */ int nlines; /* Число строк в файле */ long offsets[MAXLINES];/* Адреса начал строк */ extern long ftell();/*Выдает смещение от начала файла*/



Содержание  Назад  Вперед