Доброго времени суток! Сегодня мы поговорим о строках и символах в Си, и о том, как они передаются в файл.
Сначала немного теории. До этого момента мы уже разбирали, как передавать переменную на вывод с помощью спецификаторов формата (%d, %c и т.д.). А также рассматривали различные методы открытия файлов для записи и чтения. Теперь давайте обобщим все варианты открытия файла и, что значит каждое обозначение.
Режимы чтения и записи файлов
В Си, для открытия файла, используется команда fopen(), в аргументах которого записывается имя файла и обозначение режима записи:
r (r+) — файл открывается для чтения (чтения и записи);
w (w+) — открывается пустой файл для записи (чтения и записи). Если файл с таким именем существует, он стирается;
a (а+) — файл открывается для дополнения в конец (чтения и дополнения).
Как пример: file = fopen("file.tx)
.
Спецификаторы
Повторим основную часть для функции scanf():
%c Читает одиночные символы
%d Читает десятичное число
%f Читает число с плавающей запятой
%s Читает строку
Другие функции считывания разберём уже на примерах.
Задачи на запись и считывание строк и символов в Си
Теперь, когда мы всё обобщили приступим к задачам на символы и строки.
Записать в текстовый файл на разных строках 5 слов и 3 числа, закрыть его, а потом дописать туда еще 2 символа.
Данная несложная задача проверяет нас на знание тех самых режимов открытия файлов, о которых мы говорили ранее.
#include #include int main(void) { FILE*file; file = fopen(«file.txt»,»w+»); char str[200]; int ch1, ch2, ch3; gets(str); scanf(«%d%d%d», & ch1,& ch2,& ch3);
Для работы со строками в Си предусмотрены разнообразные библиотеки с различными функциями. В стандартной библиотеке список таких функций скромен, но в большинстве случаев этого достаточно. gets() аналог функции scanf(), однако, работает он только со строкой. Записывает в указанный аргумент сканируемую им строку из консоли ввода в формате символов.
На самом деле и обычные строки следует воспринимать как обычные одномерные массивы с форматом char. Также следует учесть, что размер массива (у нас char str[200]) должен быть не меньше чем строка, а лучше больше.
fputs(str, file); fprintf(file,"\n%d, %d, %d", ch1,ch2,ch3); fclose(file);
Произведена запись в файл считанных с консоли строки и цифр. И закрыли файл. ВСЕГДА закрывайте файл после открытия. иначе это может повлиять на работоспособность вашего компьютера.
file = fopen("file.txt","a+"); char sym1 = 'R', sym2 = 'T'; fprintf(file, " \n %c , %c ", sym1, sym2); fclose(file); return EXIT_SUCCESS; }
Идём по заданию и снова открываем файл. Обращаю внимание на режим открытия файла («a+»), записываем туда 2 символа. И закрываем файл.
Создать вручную англоязычный текстовый файл небольшого объема. Прочитать файл посимвольно и вывести на экран все символы из файла. Пропустив строку, вывести на экран первую и последнюю букву каждой строки в файле.
Так как предстоит более сложная работа со строками, сразу подключим библиотеку string.h
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 200 int main(void) { int i = 0; FILE*file; file = fopen("file.txt", "r"); char sym[N], c = 0; while( (c = fgetc(file)) != EOF){ printf("%c", c); }
После открытия файла в режиме чтения и инициализации переменных, идёт код, который пригодится вам в будущем. Вывод на экран файла посимвольно! В условии к while указано «пока сканированный символ не означает конец файла». EOF — символ известный в С++ как «\0», означает конец файла.
fclose(file); printf("\n"); file = fopen("file.txt", "r"); while( !feof(file)){ fscanf(file,"%s",sym); i = (strlen(sym)); printf("%c %c ", sym[0], sym[i-1]); } fclose(file); return EXIT_SUCCESS; }
Условие, используемое при while, такое же как и в предыдущей статье, однако имеет более короткую форму. Функция strlen() из библиотеки string.h позволяет определить длину строки. И представив, что строка — одномерный массив, обратимся к конкретным символам через индекс.
Создать вручную англоязычный текстовый файл небольшого объема. Найти, сколько всего гласных содержится в этом файле. Найти количество гласных в каждой строке файла. Результаты дописать в этот же файл на новой строке.
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 int main(void) { int vse = 0, i = 0, k = 0; FILE*file; file = fopen("file.txt", "r"); char c = 0, temp[N]; while( (c = fgetc(file)) != EOF){ if ((c == 'A') || (c == 'a') || (c == 'E') || (c == 'e') || (c == 'I') || (c == 'i') || (c == 'O') || (c == 'o') || (c== 'Q') || (c == 'q') || (c == 'U') || (c == 'u') || (c == 'Y') || (c == 'y')) vse++; } fclose(file);
Перво-наперво, посчитаем количество гласных во всём файле с помощью счётчика vse.
file = fopen("file.txt", "r"); k = 0; while (!feof(file)){ fgets(temp, N, file); k++; } fclose(file);
Теперь посчитаем количество строк, чтобы создать одномерный массив с количеством элементов равным количеству строк.
file = fopen("file.txt", "r"); int * kol; int j; kol = (int*)malloc(k * sizeof(int)); for (j = 0; j < k; j++){ kol[j] = 0; fgets(temp, N ,file); for (i = 0; i < (strlen(temp)); i++){ if ((temp[i] == 'A') || (temp[i] == 'a') || (temp[i] == 'E') || (temp[i] == 'e') || (temp[i] == 'I') || (temp[i] == 'i') || (temp[i] == 'O') || (temp[i] == 'o') || (temp[i] == 'Q') || (temp[i] == 'q') || (temp[i] == 'U') || (temp[i] == 'u') || (temp[i] == 'Y') || (temp[i] == 'y')) kol[j]++; } } fclose(file);
Не пугайтесь, друзья! Для создания массива, размер которого содержится в переменной, используется команда (int*)malloc(k * sizeof(int));
. Грубо говоря, мы создали динамический массив в Си. В цикле, сканируя по строке с помощью fgets() (где temp — переменная куда записать строку, N — количество символов, file — название файла с которым работаем), находим в строке гласные буквы. В конце записываем значение счётчика в наш массив.
file = fopen("file.txt", "a+"); fprintf(file,"\n"); for (j = 0; j < k; j++){ fprintf(file,"%d ", kol[j]); } fprintf(file,"\t vse %d", vse); fclose(file); free(kol); return EXIT_SUCCESS; }
Теперь просто записываем требующиеся по заданию показания счётчиков в конец файла. Как и в случае закрытия файлов, так и при работе с malloc ВСЕГДА освобождайте память в конце программы с помощью команды free()
, где в аргументах имя переменной.
На сегодня всё, если остались вопросы, пишите в комментариях. Вот исходники:
Все исходники без файлов txt.
Скачать исходники задачи — 1
Скачать исходники задачи — 2
Скачать исходники задачи — 3
Будьте первым, кто оставит комментарий