Các toán tử sử dụng với cont rỏ tương tự như C/C++ &: toán tử lấy địa chỉ

Một phần của tài liệu TÌM HIỂU NGÔN NGỮ C# VÀ VIẾT MỘT ỨNG DỤNG MINH HỌA phần 10 docx (Trang 40 - 43)

&: toán tử lấy địa chỉ

*: toán tử lấy nội dung con trỏ

->: toán tử đến các thành viên của con trỏ

Ví dụ dưới đây sử dụng con trỏ làm tham số cho hai hàm WinAPI CreatFile và ReadFile. ReadFile. Ví d 22-2 S dng con tr trong C# using System; using System.Runtime.InteropServices; using System.Text; class APIFileReader {

// import hai phương thức, phải có từ khóa unsafe

[DllImport("kernel32", SetLastError=true)]

static extern unsafe int CreateFile( string filename, uint desiredAccess, uint shareMode, uint attributes, uint creationDisposition, uint flagsAndAttributes, uint templateFile); // API phải dùng con trõ

[DllImport("kernel32", SetLastError=true)]

static extern unsafe bool ReadFile( int hFile,

int nBytesToRead,

int* nBytesRead,

int overlapped);

// hàm dựng: mở một tập tin đã tồn tại

public APIFileReader(string filename) {

fileHandle = CreateFile( filename, // tập tin

GenericRead, // cách truy xuất - desiredAccess

UseDefault, // shareMode UseDefault, // attributes OpenExisting, // creationDisposition UseDefault, // flagsAndAttributes UseDefault); // templateFile }

// unsafe: cho phép tạo con trỏ và

// ngữ cảnh unsafe (unsafe context)

public unsafe int Read(byte[] buffer, int index, int count) {

int bytesRead = 0;

// fixed: cấm CLR dọn dẹp rác

fixed (byte* bytePointer = buffer)

{

ReadFile(

fileHandle, // hfile

bytePointer + index, // lpBuffer

count, // nBytesToRead &bytesRead, // nBytesRead 0); // overlapped } return bytesRead; }

const uint GenericRead = 0x80000000;

const uint OpenExisting = 3;

const uint UseDefault = 0;

int fileHandle; }

class Test {

public static void Main( ) {

APIFileReader fileReader =

new APIFileReader("myTestFile.txt"); // tạo buffer và ASCII coder

const int BuffSize = 128;

byte[] buffer = new byte[BuffSize];

ASCIIEncoding asciiEncoder = new ASCIIEncoding( );

// đọc tập tin vào buffer và hiển thị ra màn hình console

while (fileReader.Read(buffer, 0, BuffSize) != 0) {

Console.Write("{0}", asciiEncoder.GetString(buffer)); }

} }

Phần 2

Một phần của tài liệu TÌM HIỂU NGÔN NGỮ C# VÀ VIẾT MỘT ỨNG DỤNG MINH HỌA phần 10 docx (Trang 40 - 43)

Tải bản đầy đủ (PDF)

(65 trang)