Помогите разобраться с текстом программы. В данном примере происходит открытие текстового файла с помощью прерываний. Не могу разобраться что и зачем происходит в каждой строке, нужно подписать каждую, или хотябы основные моменты
void second()
{
printf("\nЧтение из файла с помощью прерывания\n");
union REGS in, out;
struct SREGS segregs;
char text[400];
char file[20] = "text.txt";
for(int i = 0; i < 400; i++)
text[i] = '\0';
in.h.ah = 0x3D;
in.h.al = 0x00;
segregs.ds = FP_SEG(file);
in.x.dx = FP_OFF(file);
int86x(0x21, &in, &out, &segregs);
if (out.x.cflag == 1)
printf("Ошибка открытия файла. Ошибка = %d.\n", out.x.ax);
else
{
int handle = out.x.ax;
in.x.bx = handle;
segregs.ds = FP_SEG(text);
in.x.dx = FP_OFF(text);
in.h.ah = 0x3f;
in.x.cx = 400;
int86x(0x21, &in, &out, &segregs);
if (out.x.cflag == 1)
printf("Ошибка чтения файла. Ошибка = %d.\n", out.x.ax);else
{
printf("Чтение успешно. Прочитано %d байт\n", out.x.ax);
printf("%s\n", text);
}
in.h.ah = 0x3E;
in.x.bx = handle;
int86(0x21, &in, &out);
if (out.x.cflag == 1)
printf("Ошибка закрытия файла. Ошибка = %d.\n", out.x.ax);
getch();
}
}
Другие языки программирования и технологии
Borland C. Чтение файла с помощью прерываний
я тоже особо не знаю, но предполагаю
void second() // функция
{
printf("\nЧтение из файла с помощью прерывания\n");
union REGS in, out; // объявление нужные, но что внутри не знаю
struct SREGS segregs; // объявление нужные, но что внутри не знаю но предполагаю регистры
char text[400]; // длина буфера
char file[20] = "text.txt"; // имя файла
for(int i = 0; i < 400; i++) text[i] = '\0'; // заполнить текст нулями
in.h.ah = 0x3D; // см функции дос, по идее функция открытия файла
in.h.al = 0x00; // по идее режим чтения
segregs.ds = FP_SEG(file); // регистр ds устанавливается как у файла, тоже гляди ассемблер
in.x.dx = FP_OFF(file); // тоже для файла
int86x(0x21, &in, &out, &segregs); // какая-то функция выполнения int21 прерывания доса
if (out.x.cflag == 1)
printf("Ошибка открытия файла. Ошибка = %d.\n", out.x.ax);
else
{
int handle = out.x.ax; // не помню... хотя вроде а ax хендл открытого файла
in.x.bx = handle; // потом в bx для передачи другим функциям и далее подобно как выше
segregs.ds = FP_SEG(text);
in.x.dx = FP_OFF(text);
in.h.ah = 0x3f; // номер функции для чтения
in.x.cx = 400; // кол. байт для чтения вроде так
int86x(0x21, &in, &out, &segregs); // подобно выше
if (out.x.cflag == 1)
printf("Ошибка чтения файла. Ошибка = %d.\n", out.x.ax);else
{
printf("Чтение успешно. Прочитано %d байт\n", out.x.ax);
printf("%s\n", text);
}
in.h.ah = 0x3E; // функция закрытия
in.x.bx = handle; // в регистр bx хендл файла нужно передать и все остальное подобно
int86(0x21, &in, &out);
if (out.x.cflag == 1)
printf("Ошибка закрытия файла. Ошибка = %d.\n", out.x.ax);
getch();
}
}
Короче, даже не си это, а зачем так извращаться и применять прерывание int 21 досовское мне не ведомо, всегда использовали стандартные библиотечные функции открытия и тд.
void second() // функция
{
printf("\nЧтение из файла с помощью прерывания\n");
union REGS in, out; // объявление нужные, но что внутри не знаю
struct SREGS segregs; // объявление нужные, но что внутри не знаю но предполагаю регистры
char text[400]; // длина буфера
char file[20] = "text.txt"; // имя файла
for(int i = 0; i < 400; i++) text[i] = '\0'; // заполнить текст нулями
in.h.ah = 0x3D; // см функции дос, по идее функция открытия файла
in.h.al = 0x00; // по идее режим чтения
segregs.ds = FP_SEG(file); // регистр ds устанавливается как у файла, тоже гляди ассемблер
in.x.dx = FP_OFF(file); // тоже для файла
int86x(0x21, &in, &out, &segregs); // какая-то функция выполнения int21 прерывания доса
if (out.x.cflag == 1)
printf("Ошибка открытия файла. Ошибка = %d.\n", out.x.ax);
else
{
int handle = out.x.ax; // не помню... хотя вроде а ax хендл открытого файла
in.x.bx = handle; // потом в bx для передачи другим функциям и далее подобно как выше
segregs.ds = FP_SEG(text);
in.x.dx = FP_OFF(text);
in.h.ah = 0x3f; // номер функции для чтения
in.x.cx = 400; // кол. байт для чтения вроде так
int86x(0x21, &in, &out, &segregs); // подобно выше
if (out.x.cflag == 1)
printf("Ошибка чтения файла. Ошибка = %d.\n", out.x.ax);else
{
printf("Чтение успешно. Прочитано %d байт\n", out.x.ax);
printf("%s\n", text);
}
in.h.ah = 0x3E; // функция закрытия
in.x.bx = handle; // в регистр bx хендл файла нужно передать и все остальное подобно
int86(0x21, &in, &out);
if (out.x.cflag == 1)
printf("Ошибка закрытия файла. Ошибка = %d.\n", out.x.ax);
getch();
}
}
Короче, даже не си это, а зачем так извращаться и применять прерывание int 21 досовское мне не ведомо, всегда использовали стандартные библиотечные функции открытия и тд.
Похожие вопросы
- Определение размера файла в Borland C++
- Borland_C++
- Компиляция в Borland c++
- (Borland C++) Неизвестно откуда берет значение. Помогите, кто знает. Заранее спасибо!
- Стоит ли учить Borland C++ Builder 6
- Как в этом коде C++ в файл через каждые две буквы добавить цифру любую? За ранее огромное спасибо
- Народ какая разница между borland c++ и visual c++
- Как научиться программировать на C++ с нуля, имея под рукой среду разработки Borland C++ Builder 6.0
- Проблемы с кодировкой в компиляторе Borland C++ Builder
- Почему программа не компилируется в Borland C++ Builder?