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

Тема в разделе "C/C++/C#", создана пользователем murtukov, 4 янв 2013.

Наш партнер Genesis Hackspace
  1. murtukov

    murtukov New Member

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

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

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

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

    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.

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

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

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

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

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

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

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

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

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

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