1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Вопросы новичков и не только", создана пользователем murtukov, 4 янв 2013.

  1. murtukov

    murtukov New Member

    Репутация:
    0
    Регистрация:
    19 ноя 2012
    Сообщения:
    3
    Симпатии:
    0
    Привет всем!

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

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

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

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

    и т.д.

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

    Код:
    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 (фамилия).
    Файл открывается три раза. Первый раз в режиме а, чтобы создать файл, если он не существует.

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

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

    Код:
    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.

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

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

    rrrFer Гость

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

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

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

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

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

    можешь открыть 1 раз с режимом "r+a", вроде бы (я не помню все эти сишные штуки)

    может быть rwa или rw+a тоже сработают (только в этом случае надо следить за указателем(кареткой) в файле (вроде бы функции fseek, ftell и еще какие-то. на cplusplus.com можно почитать описание по fopen, там про режимы все должно быть написано и про можно найти ссылки на описание смежных функций.
     
Загрузка...
Похожие Темы - Вставить Текст Определенное
  1. nexlez
    Ответов:
    0
    Просмотров:
    416
  2. Aaleks111
    Ответов:
    2
    Просмотров:
    744
  3. Amfion
    Ответов:
    5
    Просмотров:
    946
  4. Dimkawshm
    Ответов:
    2
    Просмотров:
    2.004
  5. alba
    Ответов:
    1
    Просмотров:
    2.077

Поделиться этой страницей