Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2022, 00:22   #1
sirbin
Новичок
Джуниор
 
Регистрация: 25.12.2022
Сообщений: 1
По умолчанию Обработка файлов произвольного доступа

Программа создает в файле массив указателей фиксированной размерности на строки текста. Размерность массива находится вначале файла, сами строки также хранятся в файле в виде записей переменной длины. Написать функцию чтения строки из файла по заданному номеру.
sirbin вне форума Ответить с цитированием
Старый 25.12.2022, 00:55   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,388
По умолчанию

Код:
FILE_BEGIN = 0
ReadString:
  virtual at ebp-.loc_length
    label .local
      .hFile		dd ?
      .nCount		dd ?
      label .oFile qword
      .oFile.low		dd ?
      .oFile.hgh		dd ?
    label .loc_length at (0 - 4) and ($ - .local + 3)
    rd 2
    label .args
      .lpszFileName		dd ?
      .iStringNumber		dd ?
    label .args_count at (0 - 4) and ($ - .args + 3)
  end virtual
	push	ebp
	mov	ebp,	esp
  if .loc_length
	lea	esp,	[.local]
  end if
	mov	eax, [.lpszFileName]
	call	.fopen ; открываем файл
	jc	.error0
	mov	[.hFile],	eax
	mov	edx, 4
	lea	ecx, [.nCount]
	call	.fread ; читаем из файла количество записанных в нем строк (первые 4 байта)
	jc	.error1
	mov	eax, [.iStringNumber]
	cmp	eax, [.nCount]
	jae	.error2
	lea	ecx, [eax * 8 + 4] ; вычисляем позицию в массиве указателя i-ой строки
	mov	edx, FILE_BEGIN
	mov	[.oFile.low], ecx
	and	[.oFile.hgh], 0
	lea	ecx, [.oFile]
	mov	eax, [.hFile]
	call	.fseek ; переходим к указателю i-ой строки
	jc	.error3
	mov	edx, 8
	lea	ecx, [.oFile]
	mov	eax, [.hFile]
	call	.freed ; читаем из файла указатель на строку
	jc	.error4
	mov	edx, FILE_BEGIN
	lea	ecx, [.oFile]
	mov	eax, [.hFile]
	call	.fseek ; переходим к начале i-ой строки по указателю
	jc	.error5
	mov	edx, 4
	lea	ecx, [.nCount]
	mov	eax, [.hFile]
	call	.freed ; читаем длину i-ой строки (4 байта в начале)
	jc	.error6
	mov	edx, [.nCount]
	xor	eax, eax
	sub	eax, edx
	lea	esp, [.local + eax] ; выделяем под нее память в стеке (так лучше не делать, но для примера пойдет)
	mov	ecx, esp
	mov	eax, [.hFile]
	call	.freed ; читаем строку из файла в буфер
	jc	.error7
	mov	eax, [.hFile]
	call	.fclose ; закрываем файл
	mov	eax, esp ; возвращаем указатель на строку
	leave
  if .args_count
	retn	.args_count
  else
	retn
  end if

  .error7:
  .error6:
  .error5:
  .error4:
  .error3:
  .error2:
  .error1:
	mov	eax, [.hFile]
	call	.fclose ; закрываем файл и обрабатываем ошибку

  .error0:
	xor	eax, eax
	leave
  if .args_count
	retn	.args_count
  else
	retn
  end if

.fread: ; системный вызов Linux i586 32-bit: чтение по хэндлу
	push	ebx
	mov	ebx, eax
	mov	eax, 3
	int	128
	cmp	eax, edx
	jnz	@f
	pop	ebx
	clc
	retn

  @@:
	pop	ebx
	stc
	retn

.fopen: ; системный вызов Linux i586 32-bit: открытие файла для чтения
	push	ebx
	xor	edx, edx
	xor	ecx, ecx
	mov	ebx, eax
	mov	eax, 5
	int	128
	test	eax, eax
	js	@f
	pop	ebx
	clc
	retn

  @@:
	pop	ebx
	stc
	retn

.fclose: ; системный вызов Linux i586 32-bit: закрытие файла
	push	ebx
	mov	ebx, eax
	mov	eax, 6
	int	128
	pop	ebx
	clc
	retn

  @@:
	pop	ebx
	stc
	retn

.fseek: ; системный вызов Linux i586 32-bit: установка указателя в файле
	push	edi
	push	esi
	push	ebx
	push	eax
	push	eax
	mov	edi, edx
	mov	esi, esp
	mov	edx, [ecx + 0]
	mov	ecx, [ecx + 4]
	mov	ebx, eax
	mov	eax, 140
	int	128
	pop	ecx
	pop	edx
	test	eax, eax
	js	@f
	pop	ebx
	pop	esi
	pop	edi
	clc
	retn

  @@:
	pop	ebx
	pop	esi
	pop	edi
	stc
	retn

Последний раз редактировалось macomics; 25.12.2022 в 01:11.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами произвольного доступа Tolya92 Паскаль, Turbo Pascal, PascalABC.NET 0 12.12.2012 15:55
Файлы произвольного доступа(паскаль) weech Помощь студентам 2 15.03.2012 20:03
файл произвольного доступа!!! SeregaTihonov Общие вопросы C/C++ 2 26.03.2011 23:37
Файл произвольного доступа ensoleille Помощь студентам 0 14.03.2011 22:51
Обработка файлов последовательного доступа.Турбо Паскаль. Kabuto07 Помощь студентам 2 24.04.2010 15:30