Консультация № 184437
13.11.2011, 13:34
71.57 руб.
0 4 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Собственно, задача такая (VS2008):

во входном файле в одну строчку записаны данные в таком виде: две буквы (имя строчки), потом сама строчка -- и такие записи разделены #. Например: "ablala#baabcd#zz g" означает:
ab -> "lala"
ba -> "abcd"
zz -> " g"

Должны быть написаны две функции:

1) Считать файл в буфер, по нему построить индексный файл в бинарном формате, состоящий из идущих подряд "записей": 2 символа (имя), int (начало), int (длина) -- числа должны быть записаны как 4 (ну или 8) байтов с помощью fwrite.

2) Считать индексный файл целиком. Имея информацию о начальной позиции и длине, без последовательного поиска по входному файлу считать ровно то, что нужно (fseek, fread). "То, что нужно" -- это имеется ввиду, нужно спросить пользователя имя строчки, и вот эта строчка -- "то, что нужно". Получить с клавиатуры заменяющую строчку, обрезать/дополнить пробелами (затерев 0 в конце) до длины как у исходной строки, и записать её во входной файл.

Желательны комментарии.

Спасибо.

Обсуждение

Неизвестный
14.11.2011, 20:11
общий
Ну что, неужели никто не сподобится ... ?
Неизвестный
14.11.2011, 21:28
общий
Постараюсь завтра сделать, если на работе время будет. Я правильно понимаю, что "начало" - это начало записи в исходном файле в байтах?
Неизвестный
14.11.2011, 23:32
общий
Ну да, скорее всего, именно так ...

Спасибо за отклик - думал, здесь уже все в отпуск внезапно ушли ...
Неизвестный
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;
}

Форма ответа