Форум программистов, компьютерный форум CyberForum.ru

Бинарный файл - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
11.11.2010, 16:44     Бинарный файл #1
Привет всем
Помогите пожалуйста разобраться!
Задача: Дан символьный файл. Определить входит ли в него сочетание abcdefgh. Найти число вхождений ab.
И нужно заполнить файл.
Не знаю как это сделать с бинарным файлом!
Можно хотя бы просто решения каких-нибудь задач с бинарным файлом буду очень благодарна!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 07:25     Бинарный файл #2
надо на символе 'a' начинать накапливать буфер, сравнивая его с "abcdefgh"
и отдельный буфер накапливать, сравнивая его с "ab"
буферы должны быть отдельными, потому что строки оказались похожими случайно

Добавлено через 1 минуту
в смысле открывать как fopen("file.txt", "rb"), а читать посимвольно через getc() в переменную типа int
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
12.11.2010, 10:54  [ТС]     Бинарный файл #3
спасибо
мне нужно заполнить файл и я не могу понять как это сделать именно на низком уровне
как у нас в пособии написано fopen( "f","r") это высокий уроень, или я что-то путаю?

Добавлено через 4 минуты
если можете вышлите пожалуйста пример заполнения файла и считывания из него данных побайтово
Заранее СПАСИБО!!!
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 11:17     Бинарный файл #4
fopen() - это обёртка для open() или creat() (ну, на лине)
putc() - это обёртка для write() (тоже на лине)

open(), read(), write()

C
1
2
3
4
5
    unsigned char uc;
 
    read(0, &uc, 1); /* читает из стандартного потока ввода один символ в uc */
 
    write(1, &uc, 1); /* пишет в стандартный поток вывода один символ из uc */
дескриптор файла - это целое число, когда open() открывает файл, она возвращает целое число, соответствующее дескриптору открытого файла, или -1 в случае ошибки открытия (вроде даже создавать может файл, если его нет, хотя для этого есть creat() )
Mencey
 Аватар для Mencey
145 / 92 / 7
Регистрация: 22.07.2010
Сообщений: 424
12.11.2010, 16:40     Бинарный файл #5
fread и fwrite
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.11.2010, 23:21     Бинарный файл #6
fread() и fwrite() - это тоже верхний уровень, они также основаны на read() и write() в лине
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
14.11.2010, 08:30  [ТС]     Бинарный файл #7
Еще пара вопросов, чтобы разобраться
read(0,&un,1), что означает 0
и почему чаровскую переменную мы именно так описываем?
Mencey
 Аватар для Mencey
145 / 92 / 7
Регистрация: 22.07.2010
Сообщений: 424
14.11.2010, 13:36     Бинарный файл #8
0, как я понимаю, это стандартного потока ввода, а 1 -стандартного потока вывода.
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
14.11.2010, 14:34  [ТС]     Бинарный файл #9
read(<дескриптор файла>,<указатель на буфер>,<число читаемых байтов>)
write(<дескриптор файла>,<указатель на буфер>,<число записываемых байтов>)
если описать файл как int f
а переменную чаровского типа как char ch
то как посимвольно считывать из файла, используя read????
я не понимаю((
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.11.2010, 22:45     Бинарный файл #10
Цитата Сообщение от nas
а переменную чаровского типа как char ch
то как посимвольно считывать из файла, используя read????
я не понимаю((
вверху написано, только там unsigned char (если будешь сохранять в int, не нужно будет приводить к unsigned char)

Цитата Сообщение от nas
если описать файл как int f
то нужно его открыть сначала с помощью open()

man 2 open
Код
НАЗВАНИЕ
       open, creat -- открыть и, вероятно, создать файл или устройство

КРАТКАЯ СВОДКА
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);
       int creat(const char *pathname, mode_t mode);
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
15.11.2010, 12:53  [ТС]     Бинарный файл #11
хорошо, сейчас попробую, спасибо большое, ПРЕБОЛЬШОЕ!!!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include<io.h>
#include<fcntl.h>
#include<sys\stat.h>
#include<stdio.h>
#include<iostream.h>
#include <string.h>
 
 
class FILES
{
  private:
     int f;
     public:
        void vvod();
        void ab();
        void abcdefgh();
        int chislo(char);
 
};
 
void  FILES::vvod()
{
  int ch;
  puts("Введите элементы файла: ");
  f=creat("f1.cpp",S_IWRITE);
  cin>>ch;
  while (ch!=0)
      {
        cin>>ch;
        write(f,&ch,1);
      }
  close(f);
}
 
void  FILES::ab()
{
 int ch;
 int k=0;
 f=open("f1.cpp",O_RDONLY);
 {
  while (!eof(f))
  {
    read(f,&ch,1);
    if (ch=='a') {
                    while ((ch=='a') && (!eof(f)))
                     read(f,&ch,1);
                    if (ch=='b') k++;
                  }
 }
 }
 cout<<"кол-во вхождений ab: "<<k<<"\n";
 close(f);
}
 
void FILES:: abcdefgh()
{
 int ch;
 char* st;
 st=new char[8];
 int n=0;
 int i=0;
 f=open("f1.cpp",O_RDONLY);
 while ((i<7) && (!eof(f)))
    {
     read(f,&ch,1);
     st[i]=ch;
     i++;
    }
  if  (!(strcmp(st,"abcdefgh"))) n=1;
  else {
            while (!eof(f))
            {
             read(f,&ch,1);
             for (i=0;i<6;i++)
              st[i]=st[i+1];
             st[7]=ch;
             if  (!(strcmp(st,"abcdefgh"))) {n=1;break;}
            }
 
         }
 if (!n) cout<<"abcdefgh не входит \n";
            else cout<<"abcdefgh входит \n";
 
 close(f);
}
 
int FILES:: chislo(char ch1)
{
 int ch;
 int n=0;
 f=open("f1.cpp",O_RDONLY);
 while (!eof(f))
 {
  read(f,&ch,1);
  if (ch==ch1) n++;
 }
 close(f);
 return n;
}
 
 
void main()
{
 FILES A;
 A.vvod();
 A.ab();
 A.abcdefgh();
 char a='a',b='b',c='c',d='d',e='e',f='f',g='g',h='h';
 cout<<"Na  Nb  Nc  Nd  Ne  Nf  Ng  Nh \n";
 cout<<A.chislo(a)<<"   "<<A.chislo(b)<<"   "<<A.chislo(c)<<"   "<<A.chislo(d)<<"   ";
 cout<<A.chislo(e)<<"   "<<A.chislo(f)<<"   "<<A.chislo(g)<<"   "<<A.chislo(h);
 
}
Добавлено через 5 минут
Посмотрите пожалуйста работает ли программа,
у меня на компьютере ошибок не выдает, но почему-то не запускает задачи на файлы вообще, видимо из-за подключаемых модулей
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2010, 13:26     Бинарный файл #12
C++
1
while (!eof(f))
а это что ? там нужно проверять read()

когда открываешь или создаёшь файл, нужно проверять какой дескриптор вернулся
-1 возвращается в случае ошибки

ch сделай unsigned char
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
15.11.2010, 13:34  [ТС]     Бинарный файл #13
C++
1
while (read(f,&ch,1))
вот так нужно??

Добавлено через 1 минуту
а в остальном работает??
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.11.2010, 13:40     Бинарный файл #14
C++
1
while (read(f, &ch, 1) > 0) {
read() может возвращать -1, 0, >0

Добавлено через 2 минуты
C++
1
if (ch==ch1)
читаешь в int, а сравниваешь с char
нужно читать в unsigned char и сравнивать с int

если сравниваешь int и char, то может получиться, что будешь сравнивать какой-нибудь 0x000000FF c 0xFF в char'е, char будет расширяться до int'а и результат получится
0x000000FF == 0xFFFFFFFF, что уже не равно

и это касается символов, находящихся за семибитным пределом, потому что они все в char'е отрицательные
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
15.11.2010, 16:57  [ТС]     Бинарный файл #15
C++
1
char a='a',b='b',c='c',d='d',e='e',f='f',g='g',h='h';
честно говоря, я немного запуталась, если я опишу int ch1,
chislo(int ch1), а в главной функции в качестве ch1 посылаем 'a'..'h'
как такое возможно???!!!И почему нельзя описать основной ch как char ошибки вроде нет read(f,&ch,1)
Извините, я вам уже наверно надоела
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
15.11.2010, 17:04     Бинарный файл #16
это не низкоуровневые функции.

CreateFile\ReadFile\WriteFile

Ниже вроде только функции ядра
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.11.2010, 01:11     Бинарный файл #17
Saiberg, у неё линь

Цитата Сообщение от nas
честно говоря, я немного запуталась, если я опишу int ch1,
chislo(int ch1), а в главной функции в качестве ch1 посылаем 'a'..'h'
пример

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main(void)
{
    char c = 255;
    unsigned char uc = 255;
    int n;
        
    printf(" char: %08X" "\n", c);
    printf("uchar: %08X" "\n", uc);
    
    n = c;
    printf(" char -> int: %08X" "\n", n);
    
    n = uc;
    printf("uchar -> int: %08X" "\n", n);
    
    return 0;
}
Код
[guest@localhost tests]$ .ansi t.c -o t
t.c: В функции ‘main’:
t.c:6: предупреждение: переполнение при неявном преобразовании константы
[guest@localhost tests]$ ./t
 char: FFFFFFFF
uchar: 000000FF
 char -> int: FFFFFFFF
uchar -> int: 000000FF
[guest@localhost tests]$


C
1
2
3
4
5
6
    char c = 255;
    int n;
 
    n = c;
 
    printf("%d" "\n", n == 255);
тут получится, что n != 255, хотя туда записывали 255
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2010, 17:15     Бинарный файл
Еще ссылки по теме:

Бинарный файл структур C++
Бинарный файл C++
C++ Бинарный файл

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nas
0 / 0 / 0
Регистрация: 10.11.2010
Сообщений: 26
16.11.2010, 17:15  [ТС]     Бинарный файл #18
Спасибо, попробую сдать завтра
Yandex
Объявления
16.11.2010, 17:15     Бинарный файл
Ответ Создать тему
Опции темы

Текущее время: 00:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru