Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Пример работы с потоками






Приведенная ниже программа построчно считывает данные из текстового файла в буферную переменную s, формирует из них структуру mon и записывает ее в двоичном режиме в выходной файл. Далее иллюстрируется считывание из этого файла произвольной записи.

#include < cstdio>

#include < cstdlib>

#include < cconio>

#include < iostream>

using namespace std;

int main()

{

FILE *fi, *fo;

if((fi = fopen(" d: \\c\\binfile.txt", " r"))==0)

{

cout < < " Ошибка открытия входного файла";

return 1;

};

if((fo = fopen(" d: \\c\\binfile.out", " w+b"))==0)

{

cout < < " Ошибка открытия выходного файла";

return 1;

};

const int dl = 80;

char s[dl];

struct

{

char type[20];

int opt, rozn;

char comm[40];

}mon;

while (fgets(s, dl, fi))

{

// Преобразование строки в структуру:

strncpy(mon.type, s, 19); //Описание strncpy см. в след. разделе

mon.opt = atoi(& s[20]); //Описание atoi см. в след. разделе

mon.rozn = atoi(& s[25]);

strncpy(mon.comm, & s[30], 40);

fwrite(& mon, sizeof mon, 1, fo);

}

fclose(fi);

int i; cin > > i; // Номер записи

// Установка указателя текущей позиции файла на запись i

fseek(fo, (sizeof mon)*i, SEEK_SET);

fread(& mon, sizeof mon, 1, fo);

cout < < " mon.type "

< < mon.type < < " opt "

< < mon.opt < < " rozn "

< < mon.rozn < < endl;

fclose(fo);

}


 

Пример Текстовый файл состоит не более чем из ста различных слов.Слово – последовательность латинских букв(A..Z, a..z). Слова разделяются любыми символами. Слова в тексте могут повторятся. Для каждого слова необходимо указать какое количество раз оно встречается в тексте. Маленькие и большие буквы считать наразличимыми.(«Инфоматика»= «информатика») Имена входного и выходного файла задаются как параметры запуска, если при запуске имена не указаны, программа выполняет их ввод имен файлов с клавиатуры.

 

#include < cstdio>

#include < cstring>

#include < cctype>

//Дан текст состоящий из латинских букв, цифр и разделителей

//Словом назовем последовательность латинских букв. Известно, что в исходном тексте не более

//100 различных слов(без учета регистра).

//Создать файл в котором для каждого слова, встречающегося в исходном файле, укзавается

//Количество повторений

//пример Исходный файл:

// Ура! ура!

// Каникулы - счастливая пора! УРА

// Результат:

//Ура - 3

//Каникулы - 1

//счастливая - 1

//пора - 1

//Имена файлов задаются как параметры командной строки(если не заданы, то вводятся с клавиатуры)

 

// сравнение строк без учета регистра

int strcmp_ign_case(const char *a, const char *b){

while(*a & & *b){

if(tolower(*a)! =tolower(*b)) break;

++a;

++b;

}

return (*a)-(*b);

}

//Построение таблицы слов

int addSlovoToTable(char * arStr[], const char *str, int count[], int & n){

for(int i = 0; i< n; i++)// Цикл поиска слова в таблице

if (! strcmp_ign_case(arStr[i], str)){

count[i]++; // Если слово уже занесено, увеличиваем счетчик

return 0;

}

arStr[n] = new char[strlen(str)+1]; //Заносим новое слово

strcpy(arStr[n], str);

count[n]++;

n++;

return 0;

}

 

int main(int argc, char *argv[]){

char *arrayStr[100]; //Таблица слов

int cnt[100]; // Таблица повторений

FILE *fi, *fo; // Файлы

int i =0;

char nameFileInput[100];

char nameFileOutput[100];

char str[100];

char *delemited = ",.-!? 0123456789_; ";

for(i =0; i< 100; i++)cnt[i] = 0;

// Открытие файлов с проверкой наличия параметров коммандной строки

if (argc< 2){

printf(" ne zadano imy vhodnogo faila pri zapuske\n vvedite: ");

gets(nameFileInput);

printf(" ne zadano imy vyhodnogo faila pri zapuske\n vvedite: ");

gets(nameFileOutput);

}

else{

strcpy(nameFileInput, argv[1]);

if(argc< 3){

printf(" ne zadano imy vyhodnogo faila pri zapuske\n vvedite: ");

gets(nameFileOutput);

}

else{

strcpy(nameFileOutput, argv[2]);

}

}

if((fi=fopen(nameFileInput, " r"))==NULL){

printf(" Fail dly chteniy ne naiden");

return 1;

}

if((fo=fopen(nameFileOutput, " w"))==NULL){

printf(" Fail dly zapici ne naiden");

return 1;

}

i = 0;

// Цикл чтения из файла

while(! feof(fi)){

fgets(str, 100, fi);

if(str[strlen(str)-1]=='\n'){str[strlen(str)-1]='\0'; }// Убираем символ перевода на новую строку

puts(str);

char *ptr;

ptr = strtok(str, delemited); // Находим первое слово

while(ptr){

puts(ptr);

addSlovoToTable(arrayStr, ptr, cnt, i); // Добавляем слово в таблицу

ptr = strtok(NULL, delemited); // Находим следующее слово

}

 

}

// Вывод в файл и освобождение памяти

for(int j=0; j< i; j++){

fprintf(fo, " %s - %d\n", arrayStr[j], cnt[j]);

delete []arrayStr[j];

}

fclose(fi);

fclose(fo);

return 0;

 

}

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.