Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 14
1

Низкоуровневые средства ввода вывода в UNIX

10.11.2013, 21:58. Показов 2071. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!!! Помогите пожалуйста!! Вот задание.
Описать функцию, удваивающую в заданном файле каждую очередную четверку байт. При вводе-выводе использовать низкоуровневые средства системы UNIX.
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2013, 21:58
Ответы с готовыми решениями:

Используя средства стандартного ввода-вывода изобразить на экране график функции
Объясните пожалуйста программу не могу понять. Само задание к данной программе Заданы числа A и...

Потоковые средства ввода вывода данных
Помогите, пожалуйста переделать в поразрядные операции #include <fstream> #include <iostream>...

c++ unix перенаправление консольного ввода\вывода
Всем доброго времени суток. Сабж. Нужно из моего приложения запустить другое и получать все...

Поиск средства инвентаризации и учёта ПК и их компонентов на Unix системах
Добрый день дамы и господа! Нахожусь в поиске программного средства учета инветаризации....

3
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
11.11.2013, 18:00 2
Так пойдёт?
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
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
 
#define PROGRAM_NAME argv[0]
#define FILE_NAME argv[1]
 
int main(int argc, char ** argv) {
    int fd;
    struct stat inf;
    void * buf;
    off_t len;
    uint32_t * pstart;
    uint32_t * pin;
    uint64_t * pout;
    
    if ( argc < 2 ) {
        fprintf(stderr, "Usage: %s <file_name>\n", PROGRAM_NAME);
        exit(1);
    }
    
    if ( ( fd = open(FILE_NAME, O_RDWR) ) < 0 ) {
        perror("open");
        exit(1);
    }
    
    if ( fstat(fd, &inf) ) {
        perror("fstat");
        exit(1);
    }
    
    len = inf.st_size;
    if ( len % sizeof(uint32_t) ) {
        fprintf(stderr, "Length of the file must be a multiple of four!\n");
        exit(1);
    }
    
    if ( ftruncate(fd, len * 2) ) {
        perror("ftruncate");
        exit(1);
    }
    
    if ( ( buf = mmap(NULL, len * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0) ) == MAP_FAILED ) {
        perror("mmap");
        exit(1);
    }
    
    if ( close(fd) ) {
        perror("close");
        exit(1);
    }
    
    pstart = (uint32_t*)buf;
    pin = pstart + ( len / sizeof(uint32_t) );
    pout = (uint64_t*)buf + ( len / sizeof(uint32_t) );
    while ( pin > pstart ) {
        *(--pout) = *(--pin);
        *pout |= ( *pout ) << 32;
    }
    
    if ( munmap(buf, len * 2) ) {
        perror("munmap");
        exit(1);
    }
    
    fprintf(stderr, "Done.\n");
    exit(0);
}
Код
[andrew@andrew doubling_ints]$ hexdump file.dat 
0000000 0102 0304 0506 0708 090a 0b0c 0d0e 0f10
0000010 1112 1314 1516 1718 191a 1b1c 1d1e 1f20
0000020 2122 2324 2526 2728 292a 2b2c 2d2e 2f30
0000030 3132 3334 3536 3738 393a 3b3c 3d3e 3f40
0000040
[andrew@andrew doubling_ints]$ ./dbl32 file.dat 
Done.
[andrew@andrew doubling_ints]$ hexdump file.dat 
0000000 0102 0304 0102 0304 0506 0708 0506 0708
0000010 090a 0b0c 090a 0b0c 0d0e 0f10 0d0e 0f10
0000020 1112 1314 1112 1314 1516 1718 1516 1718
0000030 191a 1b1c 191a 1b1c 1d1e 1f20 1d1e 1f20
0000040 2122 2324 2122 2324 2526 2728 2526 2728
0000050 292a 2b2c 292a 2b2c 2d2e 2f30 2d2e 2f30
0000060 3132 3334 3132 3334 3536 3738 3536 3738
0000070 393a 3b3c 393a 3b3c 3d3e 3f40 3d3e 3f40
0000080
[andrew@andrew doubling_ints]$
1
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 14
26.11.2013, 21:56  [ТС] 3
Спасибо большое, я вот так сделал. Но у меня он копирует и четыре байта и два и три. И в конце еще и переходит на следующую строчку. Например слово program надо чтобы получилось в итоге
progprogram, а у меня получается
progprogram
ram
Как исправить, не поможете?
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
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
 
#define BUFFER_SIZE 4
 
int  fd,fdbuf;
int Double(fd,fdbuf)
{
  int i,j;
  char buffer[BUFFER_SIZE]; 
     
  while ((j = read(fd,buffer,BUFFER_SIZE)) > 0) 
  {
     i = 1;
     while ( i <= 2 ){ 
       write(fdbuf,buffer,j); 
       i++ ; 
      } 
  }
}
 
int main(int argc, char *argv[]){  
    fd = open(argv[1],O_RDONLY);
   if (fd == -1) 
   {
     printf("Ошибка открытия файла %s\n",argv[1]);
     exit(1);
   }    
 
   fdbuf = open(argv[2],O_RDWR | O_CREAT , 0666);
   if (fdbuf == -1) 
   {
     printf("Ошибка открытия файла %s\n",argv[2]);
     exit(1);
   }
     Double(fd,fdbuf);
    close(fd);   
    close(fdbuf);  
    printf("\n"); 
  return 0;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
27.11.2013, 01:33 4
Цитата Сообщение от funnyy Посмотреть сообщение
while ((j = read(fd,buffer,BUFFER_SIZE)) > 0)
Нужно проверять, сколько байт реально читается. Если 4 - два раза писать в вывод, меньше - один. Да, в конце входного файла перевод на новую строку удалите, чтобы не удивляться...
0
27.11.2013, 01:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2013, 01:33
Помогаю со студенческими работами здесь

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

Ошибка ввода\вывода 104, файле не открыт для ввода (строка 0)
Всё работает, но пишет: &quot;ошибка ввода\вывода 104, файле не открыт для ввода (строка 0). ...

Ошибка ввода/вывода 104 - файл не открыт для ввода
var a:array of integer; n,j,i,k: integer; f:text; begin ...

Не реагируют средства ввода при установке ОС
Народ, при появления первого окна при установке (там где выбираешь язык) мышка и клавиатура не...

Перенаправление потокового вывода, отладка и проверка производится на терминале UNIX'а
#include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; #include &lt;sys/types.h&gt; #include...

Низкоуровневые функции С++
Здраствуйте. Внизу код, который выполняет такую задачу: С использованием автосборщика make...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru