• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Приглашаем на KubanCTF

    Старт соревнований 14 сентября в 10:00 по москве

    Ссылка на регистрацию в соревнованиях Kuban CTF: kubanctf.ru

    Кодебай является технологическим партнером мероприятия

Вставить Текст В Определенное Место В Файле

  • Автор темы murtukov
  • Дата начала
M

murtukov

Привет всем!

Вот такая задачка:

Необходимо написать програмку которая создает файл в который можно добавлять список сотрудников и количество часов, которые они проработали. Проблема в том, что добавление информации в файл должно быть реализовано с помощью двух функций. С помощью первой можно добавить имена сотрудников с их номером, а с помощью второй к каждому имени можно приписать количество проработанных им часов.

Наглядно это будет выглядеть вот так (пример):

1. Андрей Иванов 25 часов
2. Мартин Скорсезе 13 часов
3. Роджер Желязны 15 часов
4. Рихард Штраус 68 часов
5. Фродо Беггинс 2000 часов

и т.д.

Первую функцию я написал, вот она:

C++:
int add(char x[], char y[])
{
char c;

FILE *f;
f = fopen("database.txt", "a");
fclose(f);

i=0;
f = fopen("database.txt", "r");
while(!feof(f))
{
fscanf(f, "%c", &c);
if(c=='\n')
i++;
}
fclose(f);

if(i<MAX+1)
{
f = fopen("database.txt", "r+");
fseek(f, 0L, SEEK_END);
if(i==0)
fprintf(f, "%d. %s %s\n", i+1, x, y);
else
fprintf(f, "%d. %s %s\n", i, x, y);
fclose(f);
}

На входе в функцию add поступают два массива x (имя) и y (фамилия).
Файл открывается три раза. Первый раз в режиме а, чтобы создать файл, если он не существует.

C++:
f = fopen("database.txt", "a");
fclose(f);

Второй раз файл открывается в режиме r, чтобы посчитать количество знаков \n и тем самым определить, какой номер будет у следующего имени.
C++:
 f = fopen("database.txt", "r");
while(!feof(f))
{
fscanf(f, "%c", &c);
if(c=='\n')
i++;
}
fclose(f);

i здесь глобальная переменная и ее значение сохраняется вне функции.

В наконец файл открывается в третий раз, чтобы собственно и записать имя и фамилию в файл:

C++:
if(i<MAX+1)
{
f = fopen("database.txt", "r+");
fseek(f, 0L, SEEK_END);
if(i==0)
fprintf(f, "%d. %s %s\n", i+1, x, y);
else
fprintf(f, "%d. %s %s\n", i, x, y);
fclose(f);
}

Первый if здесь я использовал, так как по условию количество сотрудников не должно превышать 20 человек. MAX = 20.

Думаю открывать файл три раза не очень то и рационально, но другого способа я не нашел. Если есть полегче, буду благодарен посмотреть на ваш код.

В общем то моя программа сейчас создает список имен, но без часов. Вторая функция должна приписывать часы к заданному сотруднику. Вот в этом то и главный мой вопрос. Спасибо всем кто откликнулся.
 
R

rrrFer

я думаю тебе лучше использовать двоичный файл (но можно и без этого обойтись)
первая функция может писать вместо часов мусор (если файл двоичный - это будет удобно)

если файл текстовый то удобнее разместить записи на отдельных строках, но тогда добавить часы так просто не получится.

вторая функция наверное должна открыть файл, найти там нужную запись, считать эту запись, перейти к этой записи еще раз (чтобы попасть на нее начало), поместить в запись(которая сейчас в ОЗУ) вместо мусора реальные часы, записать модифицированную запись в файл (при этом старая запись без часов заменится новой).

тоже самое можно делать с текстовым файлом, но вместо мусора придеца помещать в файл пробелы.

Если же мусор и пробелы в файл писать нельзя - то считываешь весь файл в память, находишь в памяти нужную запись, дописываешь к ней что-нибудь и толкаешь заново все содержимое памяти в файл.

Файл открывается три раза. Первый раз в режиме а, чтобы создать файл, если он не существует.
Второй раз файл открывается в режиме r, чтобы посчитать количество знаков \n и тем самым определить, какой номер будет у следующего имени.
можешь открыть 1 раз с режимом "r+a", вроде бы (я не помню все эти сишные штуки)

В наконец файл открывается в третий раз, чтобы собственно и записать имя и фамилию в файл:
может быть rwa или rw+a тоже сработают (только в этом случае надо следить за указателем(кареткой) в файле (вроде бы функции fseek, ftell и еще какие-то. на cplusplus.com можно почитать описание по fopen, там про режимы все должно быть написано и про можно найти ссылки на описание смежных функций.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!