17.11.2011, 16:01
общий
это ответ
Здравствуйте, Amfisat!
Вот пример такой программы. Некоторые моменты не очень рационально сделала, чтобы было соответствие заданию. Если нельзя использовать vector, пишите, переделаю на динамический массив.
Проверено на VS 2005, разночтений с 2008 по моему опыту быть не должно.
Удачи!
Приложение:
#include <conio.h>
#include <iostream>
#include <vector>
using namespace std;
struct Index { //запись для индексного файла
char name [3];
int begin;
int len;
};
void CreateIndexFile (char* inn, char* outn) //создать содержание
{
char *buf;
FILE* in = fopen (inn, "rt");
if (in == NULL) {
cout << "No input file";
return;
}
fseek (in, 0, SEEK_END); //переходим в конец файла
int size = ftell (in); //определяем текущую позицию - это будет длина файла
fseek (in, 0, 0); //возвращаемся на начало
buf = new char [size]; //выделяем память под буфер
fgets (buf, size, in); //читаем файл
fclose (in); //закрываем файл
FILE* out = fopen (outn, "wb"); //создаём файл для индекса
for (int i = 0; i<size-1; i++) { //идём по строке
Index tmp; //запись для индекса
tmp.name[0] = buf [i++]; //копируем имя
tmp.name[1] = buf [i++];
tmp.name[2] = '\0';
tmp.begin = i; //сохраняем начало
tmp.len = 0; //длина
while (buf[i]!='#' && i<size) {tmp.len++; i++;} //пока не встретим #
i++; //пропускаем #
fwrite (&tmp, sizeof (tmp), 1, out); //пишем в файл
}
fclose (out);
delete [] buf;
}
Index Found (char *inf, char *name) //поиск по имени в индексе
{
FILE* f = fopen (inf, "rb"); //открываем индексный файл
vector<Index> ind; //массив для хранения индекса
while (!feof(f)) { //читаем весь файл
Index tmp;
fread (&tmp, sizeof(tmp), 1, f); //читаем запись
ind.push_back (tmp); //пишем в массив
}
fclose (f);
for (int i = 0; i<ind.size(); i++) //ищем по массиву запись
if (strcmp(ind[i].name, name)==0) return ind[i];
Index tmp; //если не нашли, возвращаем пустую
tmp.name[0] = '\0';
tmp.begin = -1;
tmp.len = 0;
return tmp;
}
void Replace (char* inf, Index data, char* rby) //замена в файле
{
FILE* f = fopen (inf, "r+t"); //открываем файл для изменения
fseek (f, data.begin, SEEK_SET); //идём к записи
char * tmp = new char [data.len]; //буфер для новой строки
int len = strlen (rby);
for (int i = 0; i<data.len; i++) //копируем нужное количество из новой строки и дополняем пробелами, если надо
if (i<len) tmp[i] = rby[i];
else tmp[i] = ' ';
fwrite (tmp, 1, data.len, f); //пишем в файл
fclose (f);
delete [] tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
CreateIndexFile ("c:\\1.txt", "c:\\1.inf");
char buf [3], buf1 [200];
cout << "Found? ";
cin >> buf;
cout << "Replace? ";
cin >> buf1;
Replace ("c:\\1.txt", Found ("c:\\1.inf", buf), buf1);
//_getch();
return 0;
}