Win32API ファイルをシークする SetFilePointer

SetFilePointerでファイルをシークする

使用するAPI

  • CreateFile

  • WriteFile

  • ReadFile

  • SetFilePointer

  • CloseHandle

  • #include <windows.h>
    
    int
    main()
    {
    	HANDLE hFile;
    	BOOL bRet;
    	int i;
    	int n;
    	DWORD dwNumberOfReadBytes;
    	char *lpFileName = "test.txt";
    	
    
    	//ファイルを開く
    	hFile = CreateFile(lpFileName,
    		GENERIC_READ | GENERIC_WRITE,
    		FILE_SHARE_READ | FILE_SHARE_WRITE,
    		NULL,
    		OPEN_EXISTING,
    		FILE_ATTRIBUTE_NORMAL,
    		NULL);
    
    	if (hFile == INVALID_HANDLE_VALUE) {
    		return 1;
    	}
    
    	for (i = 0; i < 10; i++) {
    		//ファイルに整数を書き込む
    		bRet = WriteFile(hFile, 
    			&i, 
    			sizeof(i), 
    			&dwNumberOfReadBytes, 
    			NULL);
    
    		if (!bRet) {
    			goto Exit;	
    		}
    	}
    	
    	//先頭からsizeof(n)*5 = 20バイト目の位置に
    	//ファイルポインタを移動(シーク)する
    	SetFilePointer(hFile, sizeof(n)*5, NULL, FILE_BEGIN);
    
    
    	while (1) {
    		//整数を読み込む
    		bRet = ReadFile(hFile, 
    			&n, 
    			sizeof(n), 
    			&dwNumberOfReadBytes, 
    			NULL);
    
    		if (!bRet || dwNumberOfReadBytes == 0) {
    			goto Exit;
    		}
    		printf("n = %d\n", n);
    	}
    
    Exit:
    	//ファイルを閉じる
    	CloseHandle(hFile);
    
    
    	return 0;
    }