Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636

Файлы с прямым доступом

13.02.2019, 21:23. Показов 6525. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разработать приложение для изменения в заданном файле заданного байта на заданное значение.
Запуск осуществлять через консоль, пример:
a.exe [-?] [-v] -f flNm -n number -b bite
где -f flNm - flNm файл для редактирования
-n number - number номер байта для замены значения
-b bite - bite значение байта на которые надо заменить(число от 0 до 255).

Код должен быть написан по старинке, без использования объектов <fstream>, то есть тип данных FILE * и функции fopen, fclose, fread, fwrite.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2019, 21:23
Ответы с готовыми решениями:

Файлы с последовательным и прямым доступом
помогите пожалуйся, не понимаю я эти файлы с последовательным и прямым доступом Задание: Сформировать файл из некоторых чисел. Записать...

Массив: Сортировка прямым выводом
сортировки прямым выводом - это сортировка методом выбора? народ скажите что за сортиоровка плз

Метод сортировки прямым выбором
Привет всем. Есть код программы которая сортирует по возрастанию методом прямого выбора. При выводе отсортированного массива, она выводит 1...

19
Заблокирован
13.02.2019, 22:04
Лучший ответ Сообщение было отмечено Vlast001 как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
    FILE *f=fopen(argv[2],"r+b");
    int off,byte;
    if(f>0)
    {
        off=atoi(argv[4]);
        fseek(f,off,SEEK_SET);
        byte=atoi(argv[6]);
        fwrite(&byte,1,1,f);
        fclose(f);
        //printf("%s %d %d\n",argv[2],off,byte);
    }
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.02.2019, 22:19  [ТС]
Можете пожалуйста объяснить как это работает? Тут просто как бы нету создания файла и его чтения(как я понял), то есть я то ввел в консоль но ничего не произошло(
и еще "r+ - можно и читать и редактировать, но что значит b" ?
0
Заблокирован
13.02.2019, 22:22
командная строка? я делал под ???.ехе -f flNm -n number -b byte
b - бинарный/байтовый
1
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.02.2019, 23:14  [ТС]
Я извиняюсь, но можно конкретный пример этого самого ввода( ???.exe -f flNm -n number -b byte ) и что и где должно вывестись, а то ни файла не создает ни открывает мой имеющийся 1.txt, я не могу понять толи я не то ввожу то ли еще что-то. И еще такой вопросик, как мне вывести результат при помощи fread и разве для того что бы вывести байты не нужно использовать unsigned char?
0
Заблокирован
13.02.2019, 23:21
1.txt есть? открывается хоть File/Open, хоть блокнотом, ???.exe -f 1.txt -n 10 -b 65, 10-й символ A, и еще забыл:
C
1
2
3
4
int main(int argc , char * argv[])
{
    FILE *f=fopen(argv[2],"r+");
    .................
1
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.02.2019, 23:24  [ТС]
Так, если файл пустой то ничего не происходит, а если я вот в нем написал "f z" и ввел -f 1.txt -n 254 -b 49, то получил вот такой результат в файле, вместо "f z" : ⁦⁺†††††††††††††††††††††††††††††††††††††† †††††††††††††††††††††††††††††††††††††††† †††††††††††††††††††††††††††††††††††††††† †††††††‱ㄠ
Я новый в этом деле, скажи пожалуйста что произошло?
0
Заблокирован
13.02.2019, 23:27
IDE?
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.02.2019, 23:30  [ТС]
DEV C++ 5.11
0
Заблокирован
13.02.2019, 23:45
у меня 4.9.9: f z,куча нолей,1 нормальный байтовый вьювер есть? хотяб FAR
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
13.02.2019, 23:52  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc, char *argv[]){
    char *s = argv[1];
    FILE *f=fopen("2.txt"/*argv[2]*/,"r+b");
    fputs(s,f);
    int off,byte;
    if(f>0)
    {
        off=atoi(argv[4]);
        fseek(f,off,SEEK_SET);
        byte=atoi(argv[6]);
        fwrite(&byte,1,1,f);
        fclose(f);
        printf("%s %d %d\n",argv[2],off,byte);
    }
}
Я вот немножко изменил твой код, теперь первый аргумент вводиться в пустой файл и вот результат работы приложения при -f 2.txt -n 10 -b 65:
-f______A. Во первый, почему между ними табуляция, я так понял -f по считало за один символ? Я вообще не понимаю что происходит, я ввожу A 2.txt -n 65 -b 68 Другими словами я ввожу А, потом говорю что это 65 символ по АСКИ и говорю что его нужно заменить 68(то есть D), а в блокноте выходит так: A_______________________________________ _________D, да, именно, слишком много пробелов.

Добавлено через 2 минуты

Цитата Сообщение от CoderPC Посмотреть сообщение
нормальный байтовый вьювер есть? хотяб FAR
нету
0
Заблокирован
13.02.2019, 23:57
это не пробелы, а нулевые байты, а чего хотел вылезая за границы файла?
нечетные флаги я вовсе не проверяю, сам уж как нибудь, argc в помощь
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
14.02.2019, 00:07  [ТС]
Как я вылезаю за границы файла, как этого не делать и как сделать так что бы отображались нули, как у тебя? Что такое флаг?

Добавлено через 5 минут
Ладно, ты и так оказал большую помощь, спасибо большое, не знаю, сколько бы еще времени на это пришлось б потратить если бы не ты, еще раз спасибо.
0
Заблокирован
14.02.2019, 00:08
fputs(s,f); видимо размер 4, а -n 65 не вылезаешь?
нулевой байт не имеет образа, в Блокноте он виден как пробел
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
14.02.2019, 00:12  [ТС]
то есть, если бы у меня был FAR, то открыв в его среде блокнот можно включить отображение нулей ?
Пришло время скачать FAR ))
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
14.02.2019, 00:12
Цитата Сообщение от CoderPC Посмотреть сообщение
???.ехе -f flNm -n number -b byte
Интересно, зачем вы пишете эти опции, если никак их не анализируете? Такой формат командной строки подразумевает возможность указывать опции в произвольном порядке. Это можно сделать с помощью getopt, например, если используете компилятор gcc.
0
Заблокирован
14.02.2019, 00:16
нет, в FAR на файле F3 и F4(включает/отключает режим отображения байтов)
1
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
14.02.2019, 00:31  [ТС]
wiki это хорошо, но я в примере 1 и 2 так и ничего не понял (
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
14.02.2019, 03:20
Vlast001, вам первый вариант из стандарта POSIX подходит. Вот пример использования для вашей программы. В строке перечисления опций указываются короткие названия опций (длинные, похоже, не поддерживаются) в виде одного символа на опцию. Если опция содержит аргумент, то после буквы ставится двоеточие. Так, ? и v аргумента не требуют, а f, n и b подразумевают его наличие. При этом они еще являются обязательными, значит необходимо проверить, что они были указаны.

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
#include <iostream>
#include <string>
#include <unistd.h>
using namespace std;
 
int main(int argc, char **argv) {
    int number = -1;
    int value = -1;
    string file_name;
    
    int opt = 0;
    do {
        opt = getopt(argc, argv, "?vf:n:b:");
        if (opt == '?') {
            cout << "SYNOPSIS" << endl;
            cout << "    a.exe [-?] [-v] -f filename -n number -b value" << endl;
            cout << endl;
            cout << "COMMAND LINE OPTIONS" << endl;
            cout << "    -?    Print this help." << endl;
            cout << "    -v    Print program version." << endl;
            cout << "    -f    The name of the file to change." << endl;
            cout << "    -n    Byte number to replace." << endl;
            cout << "    -b    New byte value [0; 255]." << endl;
            exit(0);
        }
        else if (opt == 'v') {
            cout << "a.exe version 1.0" << endl;
            exit(0);
        }
        else if (opt == 'f') {
            file_name = optarg;
        }
        else if (opt == 'n') {
            number = stoi(optarg);
        }
        else if (opt == 'b') {
            value = stoi(optarg);
        }
        else if (opt == -1) {
            break;
        }
        else {
            cout << "Unknown option: " << static_cast<char>(opt) << endl;
            cout << "Ussage: a.exe [-?] [-v] -f filename -n number -b value" << endl;
            cout << "Try `a.exe -h` for more information." << endl;
            exit(1);
        }
    } while (opt != -1);
    
    if ((file_name.empty()) || (number < 0) || (value < 0) || (value > 255)) {
        cout << "Error command line options." << endl;
        cout << "Try `a.exe -h` for more information." << endl;
        exit(1);
    }
    
    //...
    
    return 0;
}
1
39 / 31 / 7
Регистрация: 31.01.2019
Сообщений: 81
14.02.2019, 15:21
Vlast001, попробуйте скомпилировать,
у Вас появится собственноручно сделанный байтовый вьювер
DEV C++ 5.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
/* Шестнадцатиричный просмотрщик. написано на C (без плюсов)
 первый аргумент - обрабатываемый файл
 второй аргумент - число выводимых строк  
 вывод в консоль (на stdout)
 проверки на точный размер файла нет, последняя выводимая строка просто дополняется нулями
 в файле на самом деле этих нулей может не быть
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//int fgets (char *str, int n, FILE *stream);
//int fgetc (FILE *stream);
/* 
//https://stackoverflow.com/questions/28596974/convert-to-ascii-to-hex-without-using-print
char* tohex (unsigned char *s) {
    size_t i, len = strlen(s)*2;    
    char *buff = malloc (len + 1);
    if (buff != NULL) {
        // Each char converted to hex digit string
        // and put in correct place.
        for (i = 0; i < len ; i += 2) {
            sprintf (&(buff[i]), "%02x", *s++);
        }
    }
    // Return allocated string (or NULL on failure).
    return buff;
}
*/
void tohex16 (unsigned char *in, char *out) {
// функция преобразует 16 байт в строку    
    for (size_t i=0;i<16;i++) {
//Вывод целого числа без знака в шестнадцетеричной систем счисления        
        sprintf (out, "%02x ", *in++);
        out += 3;
    }
    sprintf (out, "\0");
}
 
int main (int argc , char * argv[]) {
    
    unsigned int byte;
    unsigned int count=16;//выведем 16 строчек(по умолчанию)    
    char s[16];
    char outS[50];
    FILE *f=fopen(argv[1],"r");
    if(argc==3) {
        count = atoi(argv[2]);
        //printf("%i\n", count);
        }
    if(f>0){
        //puts("open file\n");
        //while(feof(f) != EOF){ // пока не дошли до конца файла//неверно - бесконечный цикл           
            for(size_t i1=0;i1<count;i1++){ //
        //if(fgets(s,16,f)) { // считываем из файла f 16 байт в строку s
        //fgets обрабатывает конец строки, символ '\n', и дальше не выводит. заменил :
                if (byte == EOF) break;
                for(size_t i2=0;i2<16;i2++){
                    byte=fgetc(f);
                    if(byte!=-1){
                        s[i2]=(char)byte;
                    }
                    else s[i2]=0;
                }       
            tohex16(s,outS);//                      
            printf ("%s\n", outS);
            //printf ("%s %s\n", outS, s);
            }
        //else {break;}
        //}
        fclose(f);
    }
    else{       
        puts("error open file");
    }   
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2019, 15:21
Помогаю со студенческими работами здесь

Бинарное дерево с прямым обходом
Нашел на просторах вашего форуме код дерева с восходящим порядком прохождения #include &lt;iostream&gt; #include &lt;ctime&gt; ...

Сортировка односвязного циклического списка (Прямым включением)
Привет всем:) Мне требуется отсортировать односвязный циклический список, методом: прямое включение. Суть сортировки я понимаю, массив...

задача с прямым течением времени, где ошибка?
исправьте пжл где моя ошибка,не могу понять где:wall: Вот код: #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include...

Поиск элемента массива прямым и двоичным способом
Написать программу поиска элемента массива 2 способами: прямым и двоичным поиском. Массив нужно задать с помощью srand. Перед поиском...

Сортировка прямым выбором в алфавитном порядке (Структуры)
В очередной раз потерпел неудачу при написании программы и обращаюсь к вам. У меня тема книжной библиотеки. Нужно создать структурный...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru