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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C]Работа с файлами, очередная лаба :) 
:(
    Опции темы
m0zg
Дата 26.11.2007, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

Двоичный файл создаётся при его открытии, а числа можно записать через rand().

Поможете?
PM MAIL   Вверх
m0zg
Дата 26.11.2007, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я тут начал писать программку, ибо подсказок нету(
Код

#include <stdio.h>

int bfile(){
    int i;
    FILE *bf;
    char buffer[10];
    for(i=0;i<buffer[9];i++){
        buffer[i] = rand()%1000;
    }
    bf = fopen("binary.dat" , "w" );
    fwrite(buffer, sizeof(buffer[0]), sizeof(buffer), bf);
    fclose(bf);
    return 0;
}

int main(){
    bfile();
    printf("Ok\n");
}


только почему-то в файле вместо цифр бред какой-то пишется...
PM MAIL   Вверх
Puoar
Дата 26.11.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(m0zg @  26.11.2007,  01:13 Найти цитируемый пост)
Поможете?

Это ты содаешь двоичный файл step1 да? Тогда
Код

bf = fopen("binary.dat" , "wb" );

так делай!
И действительно, в файле двоичные данные цифр выглядят как
Цитата(m0zg @  26.11.2007,  16:27 Найти цитируемый пост)
бред какой-то


Цитата(m0zg @  26.11.2007,  16:27 Найти цитируемый пост)

 fwrite(buffer, sizeof(buffer[0]), sizeof(buffer), bf);
 Погоди, а это что?
Код

 fwrite(buffer, buffer[0], sizeof(buffer), bf);

Так пиши!





Это сообщение отредактировал(а) Puoar - 26.11.2007, 17:35
PM MAIL   Вверх
m0zg
Дата 26.11.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А если там у меня записалась в файл такая кракозябра, тогда как правильно считать эти цифры для записи в другой (уже текстовый) файл?
PM MAIL   Вверх
m0zg
Дата 27.11.2007, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я тут немного модифицировал, но появилась такая ошибка:
Could't write into file: Bad address

Не пойму, что ему не нравится, в файл перестал писать. Вот код

Код

#include <stdio.h>
#include <stdlib.h>

int bfile(FILE *bfile){
    int i;
    int buff[3];
    for(i=0;i<buff[2];i++){
        buff[i] = rand()%10;
    }
    if(!(bfile = fopen("binary.txt", "w"))){
        perror("Could't open file");
        return;
    }
    if(!(fwrite(buff, buff[0], sizeof(buff), bfile))){
        perror("Could't write into file");
        return;
    }
    fclose(bfile);
    return 0;        
}

int main(void){
    FILE *bf;
    int wresult;
    wresult = bfile(bf);
    printf("Ok\n");
}

PM MAIL   Вверх
orthrus
Дата 27.11.2007, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



в функции у тебя ошибки, приведи вот к такому виду:

Код

int bfile(FILE *bfile){
    int i;
    int buff[3];
    for(i=0;i<3;i++){
        buff[i] = rand()%10;
    }
    if(!(bfile = fopen("binary.txt", "w"))){
        perror("Could't open file");
        return 0;
    }
    if(!(fwrite(buff, sizeof(buff[0]), sizeof(buff)/sizeof(buff[0]), bfile))){
        perror("Could't write into file");
        return 0;
    }
    fclose(bfile);
    return 0;        
}


а можно и к такому:

Код

int bfile(FILE *bfile){
    int i;
    int buff[3];
    for(i=0;i<3;i++){
        buff[i] = rand()%10;
    }
    if(!(bfile = fopen("binary.txt", "w"))){
        perror("Could't open file");
        return 0;
    }
    if(!(fwrite(buff, sizeof(buff), 1 , bfile))){
        perror("Could't write into file");
        return 0;
    }
    fclose(bfile);
    return 0;        
}


Это сообщение отредактировал(а) orthrus - 27.11.2007, 07:02


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
Puoar
Дата 27.11.2007, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Puoar @  26.11.2007,  17:32 Найти цитируемый пост)
Цитата(m0zg @  26.11.2007,  16:27 ) fwrite(buffer, sizeof(buffer[0]), sizeof(buffer), bf); Погоди, а это что?код C++1: fwrite(buffer, buffer[0], sizeof(buffer), bf);highlightSyntax('cpp_DFmNWR','cpp');highlightSyntax('cpp_DFmNWR','cpp');Так пиши!

Извиняюсь, smile
Код

fwrite(buffer, sizeof(buffer), 1, bf);

вот так вроде.
PM MAIL   Вверх
m0zg
Дата 27.11.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо smile. Такой вопросик по программе назрел... А как избавиться от повторяющаихся значений, считанных из файла?
PM MAIL   Вверх
m0zg
Дата 29.11.2007, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не подскажите алгоритм, по которому можно избавиться от повторяющихся цифр в элементах массива? Или пример кода?
PM MAIL   Вверх
orthrus
Дата 29.11.2007, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



А что если не записывать туда повторяющиеся цифры? Можно воспользоваться std::set

Это сообщение отредактировал(а) orthrus - 29.11.2007, 06:17


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
m0zg
Дата 29.11.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну да, мне и не нужно во второй текстовый файл писать повторяющиеся числа.

Про std::set. Мне ведь на C надо. Без плюсов  smile 
PM MAIL   Вверх
orthrus
Дата 30.11.2007, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



Цитата(m0zg @  29.11.2007,  21:26 Найти цитируемый пост)
Про std::set. Мне ведь на C надо. Без плюсов


Что то я подзабыл про это  smile 

вот предлагаю такое решение:

ввести функцию поиска повторных чисел
Код

int findRepeat(int* buf, size_t sz){
    for (int i=0; i<sz-1; i++)
        for (int j=i+1; j<sz; j++) 
            if (buf[i] == buf[j]) return j;
    return -1;
}


и вставить куда нужно в функцию:
Код

int bfile(FILE *bfile){
    int i;
    int buff[3];
    for(i=0;i<3;i++){
        buff[i] = rand()%10;
    }
    i = findRepeat(buff,sizeof(buff)/sizeof(buff[0]));
    while (i>=0){
        buff[i] = rand()%10;
        i = findRepeat(buff,sizeof(buff)/sizeof(buff[0]));
    }
 ...


Это сообщение отредактировал(а) orthrus - 30.11.2007, 04:59


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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