下面通过两个实例程序来演示文件I/O(输入/输出)的过程。
下面的程序用输岀模式创建一个文件,要求用户输入一些文本,将这些文本写到输出文件,并报告已写入的字节数,然后关闭文件。在试图创建文件后,程序要进行错误检查:
- ; 创建一个文件 (CreateFile.asm)
- INCLUDE Irvine32.inc
- BUFFER_SIZE = 501
- .data
- buffer BYTE BUFFER_SIZE DUP(?)
- filename BYTE "output.txt",0
- fileHandle HANDLE ?
- stringLength DWORD ?
- bytesWritten DWORD ?
- str1 BYTE "Cannot create file",0dh,0ah,0
- str2 BYTE "Bytes written to file [output.txt]: ",0
- str3 BYTE "Enter up to 500 characters and press "
- BYTE "[Enter]: ",0dh,0ah,0
- .code
- main PROC
- ; 创建一个新文本文件
- mov edx,OFFSET filename
- call CreateOutputFile
- mov fileHandle,eax
- ; 错误检查
- cmp eax, INVALID_HANDLE_VALUE ; 发现错误?
- jne file_ok ; 否: 跳过
- mov edx,OFFSET str1 ; 显示错误
- call WriteString
- jmp quit
- file_ok:
- ; 提示用户输入字符串
- mov edx,OFFSET str3 ; "Enter up to ...."
- call WriteString
- mov ecx,BUFFER_SIZE ; 输入字符串
- mov edx,OFFSET buffer
- call ReadString
- mov stringLength,eax ; 计算输入字符数
- ; 将缓冲区写入输出文件
- mov eax,fileHandle
- mov edx,OFFSET buffer
- mov ecx,stringLength
- call WriteToFile
- mov bytesWritten,eax ; 保存返回值
- call CloseFile
-
- ; 显示返回值
- mov edx,OFFSET str2 ; "Bytes written"
- call WriteString
- mov eax,bytesWritten
- call WriteDec
- call Crlf
- quit:
- exit
- main ENDP
- END main
下面的程序打开一个文件进行输入,将文件内容读入缓冲区,并显示该缓冲区。所有过程都从 Irvine32 链接库调用:
- ; 读文件 (ReadFile.asm)
- ; 使用 Irvine32.lib 的过程打开,读取并显示一个文本文件
- INCLUDE Irvine32.inc
- INCLUDE macros.inc
- BUFFER_SIZE = 5000
- .data
- buffer BYTE BUFFER_SIZE DUP(?)
- filename BYTE 80 DUP(0)
- fileHandle HANDLE ?
- .code
- main PROC
- ; 用户输入文件名
- mWrite "Enter an input filename: "
- mov edx,OFFSET filename
- mov ecx,SIZEOF filename
- call ReadString
- ; 打开文件进行输入
- mov edx,OFFSET filename
- call OpenInputFile
- mov fileHandle,eax
- ; 错误检查
- cmp eax,INVALID_HANDLE_VALUE ; 错误打开文件?
- jne file_ok ; 否: 跳过
- mWrite <"Cannot open file",0dh,0ah>
- jmp quit ; 退出
- file_ok:
- ; 将文件读入缓冲区
- mov edx,OFFSET buffer
- mov ecx,BUFFER_SIZE
- call ReadFromFile
- jnc check_buffer_size ; 错误读取?
- mWrite "Error reading file. " ; 是: 显示错误消息
- call WriteWindowsMsg
- jmp close_file
-
- check_buffer_size:
- cmp eax,BUFFER_SIZE ; 缓冲区足够大?
- jb buf_size_ok ; 是
- mWrite <"Error: Buffer too small for the file",0dh,0ah>
- jmp quit ; 退出
-
- buf_size_ok:
- mov buffer[eax],0 ; 插入空结束符
- mWrite "File size: "
- call WriteDec ; 显示文件大小
- call Crlf
- ; 显示缓冲区
- mWrite <"Buffer:",0dh,0ah,0dh,0ah>
- mov edx,OFFSET buffer ; 显示缓冲区
- call WriteString
- call Crlf
- close_file:
- mov eax,fileHandle
- call CloseFile
- quit:
- exit
- main ENDP
- END main
如果文件不能打开,则程序报告错误:
如果程序不能从文件读取,则报告错误。比如,假设有一个错误为在读文件时使用了不正确的文件句柄:
缓冲区可能太小,无法容纳文件: