ЗАМЕЧАНИЕ
В программе на Си можно получить из операционной системы значение ряда
системных параметров — так называемых переменных окружения, для чего в
main добавляется третий предопределенный аргумент. Однако эта возможность
на практике используется редко: int main (int argc, char *argv[], char *argp[]).
Контрольные вопросы
1.
Что такое параметры операционной системы, передаваемые в
программу? Каким образом они могут использоваться?
2.
Какой параметр идет первым (с индексом ноль) в массиве argv[]?
3.
Эквивалентны ли следующие записи:
char
**argv;
char
*argv[];
char
argv[][]?
Работа с файлами
Помимо средств ввода-вывода, работающих со стандартными потоками
ввода, вывода и ошибок (фактически, это клавиатура и экран дисплея), в
стандартных библиотеках языка программирования Си присутствуют
средства для работы с информацией, находящейся на дисках и
организованной в виде файлов. Существенно облегчает понимание
принципов работы тот факт, что эти функции используют те же принципы,
что и функции для ввода-вывода со стандартных устройств.
При работе с файлами в языке Си используется понятие файловый
дескриптор. Для обозначения указателя на файл зарезервировано
специальное ключевое слово FILE — одно из немногих ключевых слов в
языке программирования Си, записываемых прописными буквами.
Например,
FILE *fp;
описывает дескриптор файла с именем fp. После объявления файлового
дескриптора его необходимо связать с физическим файлом на диске (файла
может еще не существовать, если он создается путем открытия его на
запись или добавление). Для открытия файла может использоваться
стандартная функция fopen:
fp=fopen("<имя файла>","<режим>");
Здесь
<имя файла> — строка с именем файла, соответствующая его
наименованию в операционной системе.
<режим> может быть
следующим:
103
"w"
—
запись;
"r"
—
чтение;
"a"
—
добавление.
После символа, задающего режим доступа, может идти дополнительный
символ, определяющий доступ в текстовом или бинарном режиме. По
умолчанию подразумевается текстовый режим доступа.
Если файл открывается на чтение и его нет на диске, fopen возвращает
NULL
—
специальное предопределенное значение, в противном случае —
указатель на файл (дескриптор).
Открытие на запись уже существующего файла предполагает перезапись
его содержимого.
Открытие на добавление существующего файла предполагает
приписывание информации к его концу.
Для файлового ввода-вывода существует ряд функций, соответствующих
функциям работы со стандартным вводом-выводом, в частности:
fprintf
—
для вывода в файл;
fscanf
—
для чтения из файла.
Отличие этих функций от scanf и printf заключается лишь в том, что
первым аргументом, идущим после открывающей круглой скобки, должен
быть дескриптор файла, например:
fprintf(fp,"2 + 2 = %f\n", a);
После использования файла его необходимо закрыть. Это можно сделать с
использованием функции fclose, имеющей такой синтаксис:
fclose(<
дескриптор файла>);
Следующая программа осуществляет ввод строки с клавиатуры,
сохранение ее в текстовом файле, чтение строки из файла и вывод ее на
экран:
/* Пример работы с файлом в языке программирования Си */
#include
int main()
{
FILE *f;
char str[40];
printf("
Введите строку:");scanf("%s",str);
f=fopen("file.txt","w");
if (f==NULL) return –1;
104
else
{
fprintf(f,"%s\n",str);
fclose(f);
f=fopen("file.txt","r");
fscanf(f,"%s",str);
fprintf("\n
строка из файла: %s",str);
fclose(f);
return 0;
}
}
Файл одновременно можно открыть только на чтение или только на
запись. Поэтому два раза используется вызов функции fopen с одной и
той же переменной — дескриптором файла, но с разными режимами
доступа:
Текст программы:
#include
#include
int main()
{
FILE *fp,*fp1;
char Str[80];
int sc=0;
printf ("Программа подсчета числа вхождений подстроки \"пере\" в
файле test.txt\n");
printf ("и замены слова \"абитуриент\" на слово \"студент\"\n");
// Открываем исходный файл
if ((fp=fopen("test.txt","r"))==NULL)
{
printf("Ошибка открытия файла test.txt");
return 1;
}
// Создаем промежуточный файл для копирования
if ((fp1=fopen("test.bak","w"))==NULL)
{
pri
ntf("Ошибка создания промежуточного файла");
return 2;
105
}
while (!feof(fp)) // Пока не конец исходного файла
{
fscanf(fp,"%s",Str); // Читаем строку из исходного файла
if (strstr(Str,"пере")!=NULL) sc++; // Считаем подстроки "пере"
if
(!strcmp("абитуриент",Str))
strcpy(Str,"студент"); // Замена слов
if (!feof(fp)) fprintf(fp1,"%s ",Str);
}
fclose(fp);
fclose(fp1);
if(remove("test.txt")) //
Удаляем исходный файл
{
printf("Ошибка удаления файла");
return 3;
}
if(rename("test.bak","test.txt")) // Переименовываем промежуточный
файл
{
printf("Ошибка переименования промежуточного файла");
return -1;
}
else
printf("
Было найдено %d \"пере\"\n",sc);
return 0;
}
Достарыңызбен бөлісу: |