win32apiのReadFileについての質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
学生の嘆き

win32apiのReadFileについての質問

#1

投稿記事 by 学生の嘆き » 14年前

win32apiのReadFileについての質問です。
WriteFileで書いたものをReadFileを使って参照するにはどのように記述すればよいのでしょうか。
たとえば
a b c d e f g h
このようにメモ帳にWriteFileでタブを入れながら書いて、「e」を参照したい場合
「e」が何行何列目であるかを調べるにはどのようにしたらよいのでしょうか。
¥tなどのタブの個数を数える方法などはあるのでしょうか。

教えてください。よろしくお願いします。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: win32apiのReadFileについての質問

#2

投稿記事 by beatle » 14年前

一番単純だろうと思うやり方は,1文字(そのファイルが全部ASCII文字なら1文字=1バイト)ずつ読み取って,\tかそれ以外かをif文で判断する,というのを繰り返せば,\tの数は数えられます.
1つ前の\t(または行の先頭)の直後から次の\tまでの文字を,char配列に格納しておけば,後から参照もできます.

ファイルがASCII文字だけから成るテキストファイルだと仮定した場合の,大雑把な流れ
  1. char配列bufを定義
  2. 1バイト読み取る
  3. ファイル終端ならループを抜ける
  4. 読み取った文字が\tまたは\nならbufを使って処理する(ついでにbufを空にする)
  5. 読み取った文字がその他の文字なら,bufに追加する
  6. 2 - 5を繰り返す.

学生の嘆き

Re: win32apiのReadFileについての質問

#3

投稿記事 by 学生の嘆き » 14年前

素人的な質問ですみません。
「2.1バイト読み取る」とはどのようにデータを取得すればよいのでしょうか。
#include <windows.h>
#include <math.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <commctrl.h>
//****************************************
#define APP_NAME TEXT("Sample_MainWindow")
//個別影響値の算出
double j;
double W;
double C;
double S;
double s;
double Alpha;
double beta;
//****************************************
TCHAR str[4096];
HANDLE hFile;
DWORD readsize;


/*ウィンドウプロシージャ*/
LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{//WindowProcの括弧
switch(uMsg)
{//switchの括弧
case WM_DESTROY:
PostQuitMessage(0);
CloseHandle(hFile);
return 0;

case WM_CREATE:
hFile = CreateFile(("AI Sample Data.txt"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile != INVALID_HANDLE_VALUE)//ファイルを開くことに成功したならば
{
ReadFile(hFile , str , lstrlen(str) , &readsize , NULL);
if(str[4096] = 0x0a)
{

}
}
return 0;
}//switchの括弧

/*基本的なメッセージの処理*/
return DefWindowProc(hWnd , uMsg , wParam , lParam);
}//WindowProcの括弧

//*******************************************************************************************
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
WNDCLASS wc;
MSG msg;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc; /*ウィンドウプロシージャの登録*/
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL , IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName = NULL;
wc.lpszClassName = APP_NAME;

if (!RegisterClass(&wc)) {MessageBox(NULL , TEXT("ウィンドウクラスの作成に失敗しました") , NULL , MB_OK);return 0;}

hWnd = CreateWindow(
APP_NAME , TEXT("Window Title") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100 , 100 , 400 , 300 ,
NULL , NULL , hInstance , NULL
);

if (hWnd == NULL) {MessageBox(NULL , TEXT("ウィンドウの生成に失敗しました") , NULL , MB_OK);return 0;}

/*メッセージループ*/
while(GetMessage(&msg , NULL , 0 , 0) > 0) {DispatchMessage(&msg);}

return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: win32apiのReadFileについての質問

#4

投稿記事 by みけCAT » 14年前

読み取ったstrというバッファを配列として扱い、str[0]、str[1]などに順番にアクセスすればいいです。

>ReadFile(hFile , str , lstrlen(str) , &readsize , NULL);
初期状態でstrは全て0で初期化されているので、lstrlen(str)==0であり、全く読み込まれないと思います。
lstrlen(str)→sizeof(str)だと思います。

>if(str[4096] = 0x0a)
代入していますが、大丈夫ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: win32apiのReadFileについての質問

#5

投稿記事 by beatle » 14年前

学生の嘆き さんが書きました:「2.1バイト読み取る」とはどのようにデータを取得すればよいのでしょうか。
ReadFileの説明が書かれた資料をちゃんと読んでますか?まさか,何も資料を読んでいない?

それから,ソースコードを貼るときは,codeタグで囲み,必ずプレビューしてOKかどうか確認してから投稿してください.
これはフォーラムルールです.
詳しくは投稿前チェックリストのチェック2とチェック3を御覧ください.

閉鎖

“C言語何でも質問掲示板” へ戻る