Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задача с бинарными файлами...

1.8K
07 ноября 2007 года
Death Knight
139 / / 19.02.2006
Задача
В исходном бинарном файле (создать и ввести) найти наибольшее количе-ство цифр, расположенных подряд. Результат (найденные числа) переписать в другой текстовый файл.
Решение
Код:
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>

main()
{
FILE *fp,*fp2;
int i=0,dlslova=0,p=0,d=0,dl=0,value;char str[80];
//dlslova - считает текуў посл цифр
//i хранит тек позиццию
//p хранит длину тек последовательности
//d хранит найбольшую длину послед цифр
//dl хранит позицию с которой нач найбольшая послед цифр
//value переменная для считывания из файла
fp = fopen("int.dat", "rb");
if (!fp) {
puts("Can?t open int.dat");
exit(1);
}
while(!feof(fp))
{
fread(&value, sizeof(int), 1, fp);
if (isdigit(value))
{
            dlslova++;
            printf("s=%d    i=%d   d=%d\n", value, i, dlslova);
}
            else
            {
                p=dlslova;
            if (p>d)
            {
                d=p;
                dl = i-p;
            }
                dlslova=0;
            }

            i++;
}
printf("d=%d  dl=%d d=%d", dlslova, dl, d);
fseek(fp, dl, SEEK_SET);
fp2 = fopen("out.dat", "w");
fread(&value, sizeof(int), d, fp);
fwrite(&value, sizeof(int), d, fp2);
fclose(fp2);
fclose(fp);
getch();
return 0;
}


Компилится без ошибок и вроде работает правильно но записывать в до=ругой файл не хочет ошибка вроде из за исп фсиик но если ее убрать то записывает в новый файл посл от начала а надо от позиции самаго длинной последовательности.....
13K
07 ноября 2007 года
specter
113 / / 28.09.2007
Цитата: Death Knight
Задача
В исходном бинарном файле (создать и ввести) найти наибольшее количе-ство цифр, расположенных подряд. Результат (найденные числа) переписать в другой текстовый файл.
Решение
...
Компилится без ошибок и вроде работает правильно но записывать в до=ругой файл не хочет ошибка вроде из за исп фсиик но если ее убрать то записывает в новый файл посл от начала а надо от позиции самаго длинной последовательности.....


Сразу что бросилось в глаза...
Цифра - это чар от '0' до '9'... так? почему ты из файла читаешь инт?

И что это???
fread(&value, sizeof(int), d, fp);
fwrite(&value, sizeof(int), d, fp2);
ты пишешь по адресу переменной value 4*d байтов... а ты не забыл пямять выделить под это все? При чем такой метод при данной задаче не верен

2.0K
07 ноября 2007 года
integral
86 / / 12.11.2005
Если уж обрабатуш потоковые файлы, то юзать можна и fscanf и fprintf для соответственно считываня/записи. Работают как обычные сканф/принтф, тока требуют в качестве первого аргумента указатель на FILE
1.8K
08 ноября 2007 года
Death Knight
139 / / 19.02.2006
Цитата: integral
Если уж обрабатуш потоковые файлы, то юзать можна и fscanf и fprintf для соответственно считываня/записи. Работают как обычные сканф/принтф, тока требуют в качестве первого аргумента указатель на FILE



Это я знаю просто еслі ты заметил то я что мне надо еще считать количество цифр смысл загонять все в строку потом там считать и т д.. Если можно сразу посимвольно так лучше имхо... Да цифра это от 0 до 9 какаю разница что считывать если мне нужно для проверки и проверяет оно правильно где цифры а где нет...
Это я считываю из первого файла нужное колво символов и переписываю во второй, все странносит в том что без фсика все работает тока считывает сначала файла а мне нужно с пизиции которая храниться в переменной dl, и вото когда я ее ставлю в процессе работы возникает ошибка...
Какой подход предлагаешь ты...

13K
08 ноября 2007 года
specter
113 / / 28.09.2007
Цитата: Death Knight
Какой подход предлагаешь ты...


Вот тебе решение, надеюсь разберешся что и где у тебя было не так?

Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

void main()
{
    FILE *in,*out;
    in = fopen("int.dat", "rb");
    if (!in)
        return;

    unsigned char ch;
    int dcount = 0; // макс кол-во цифр
    int dpos = 0; // позиция максимума
    int tmpcount = 0;
    int tmppos = 0;
    int curpos = 0; //текущая позиция

    while(!feof(in))
    {
        ch = fgetc(in);
        if (isdigit(ch))
        {
            if ( tmpcount == 0 )
                tmppos = curpos;
            tmpcount++;
        }
        else
        {
            if ( tmpcount > dcount )
            {
                dcount = tmpcount;
                dpos = tmppos;
            }
            tmpcount = 0;
        }
        curpos++;
    }
    if (dcount)
    {
        char * chars = new char[dcount];
        fseek(in, dpos, SEEK_SET);
        fread(chars, dcount,1, in);
       
        out = fopen("out.dat", "w");
        fwrite(chars, dcount, 1, out);
        fclose(out);
        delete chars;
    }
    fclose(in);
    system("PAUSE");
    return;
}
1.8K
08 ноября 2007 года
Death Knight
139 / / 19.02.2006
Сенкс... разобрался
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог