Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> бинарные файлы 
:(
    Опции темы
шарлотта
Дата 16.4.2017, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Здравствуйте! Требуется записать в файл целые числа в диапазоне от -10 до 10 и сформировать новый файл, в который переписать эти числа, исключив повторы. 
void BuildFile(FILE *f, int size) {
    int num;
    for (int i = 0; i < size; i++) {
        num = rand() % 11 - rand() % 11;
        fwrite(&num, sizeof(num), 1, f);
        fflush(stdin);
    }
    fclose(f);
}

void PrintFile(FILE *f){
    rewind(f);
    int num;
    while (fread(&num, sizeof(num), 1, f)) {
        printf("%5d", num);
    }
    fclose(f);
}

void Rewrite(FILE *f, FILE *g, int size){
    int num, buf;
    rewind(f);
    //fread(&num, sizeof(num), 1, f);
    //fwrite(&num, sizeof(num), 1, g);
    for (int i = 0; i < size; i++) {
        fread(&num, sizeof(num), 1, f);
        bool  flag = true;
        for (int j = 0; j < i; j++) {
            fread(&buf, sizeof(buf), 1, g);  ////здесь buf = -842150451 и поэтому следующую строку проскакивает
            if (num == buf) {
                flag = false;
            }
        }
        if (flag != false) {
            fwrite(&num, sizeof(num), 1, g);
        }
    }
    fcloseall();
}

int main() {
    setlocale(0,"russian");
    srand((unsigned)time(NULL));
    puts("Введите количество чисел");
    int size;
    scanf("%d", &size);
    printf("size = %d\n", size);
    FILE *f = fopen("bin1.txt", "w+b");
    BuildFile(f, size);
    puts("Исходный файл");
    f = fopen("bin1.txt", "rb");
    PrintFile(f);
    printf("\n");
    f = fopen("bin1.txt", "rb");
    FILE *g = fopen("bin2.txt", "w+b");
    Rewrite(f, g, size);
    printf("\n");
    puts("Новый файл");
    g = fopen("bin2.txt", "rb");
    PrintFile(g);
    printf("\n");
    puts("Нажмите любую клавишу для завершения");
    getch();
    return 0;
}

И даже если надо переписать все числа, пишет неверно. Не могу понять, почему. Буду очень благодарна за помощь!


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  бинарные_файлы.png 855,65 Kb
PM MAIL   Вверх
rudolfninja
Дата 17.4.2017, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Цитата

 fread(&buf, sizeof(buf), 1, g);  ////здесь buf = -842150451 и поэтому следующую строку проскакивает


Полагаю, что тут нужно читать из файла источника. То есть, должно быть fread(&buf, sizeof(buf), 1, f)

PM MAIL Skype   Вверх
шарлотта
Дата 17.4.2017, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



В данной строке читаю то, что написано в новом файле, и если число из исходного файла не совпадает ни с одним из записанных, то записываю это число в новый файл (это проверяю в следующих строках)
PM MAIL   Вверх
rudolfninja
Дата 17.4.2017, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Да, что то я ошибся.


Ваша ошибка в том, что вы пытаетесь прочитать из файла больше, чем в него записано. В случае с повторяющимися числами вы не писали в файл их, но счетчик i увеличивали. А из файла вы читаете i раз, даже если там нет столько чисел.
Измините условие цикла, что бы читать элементы до тех пор, пока не дойдете до конца файла ( while (!feof(g)) ). Ну и с каждой итерацией внешнего цикла нужно перемещаться на начало нового файла, для этого используйте fseek(g, 0, SEEK_SET);
PM MAIL Skype   Вверх
шарлотта
Дата 17.4.2017, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Спасибо большое, все получилось!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1110 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.