win32apiのReadFileについての質問です。
WriteFileで書いたものをReadFileを使って参照するにはどのように記述すればよいのでしょうか。
たとえば
a b c d e f g h
このようにメモ帳にWriteFileでタブを入れながら書いて、「e」を参照したい場合
「e」が何行何列目であるかを調べるにはどのようにしたらよいのでしょうか。
¥tなどのタブの個数を数える方法などはあるのでしょうか。
教えてください。よろしくお願いします。
win32apiのReadFileについての質問
Re: win32apiのReadFileについての質問
一番単純だろうと思うやり方は,1文字(そのファイルが全部ASCII文字なら1文字=1バイト)ずつ読み取って,\tかそれ以外かをif文で判断する,というのを繰り返せば,\tの数は数えられます.
1つ前の\t(または行の先頭)の直後から次の\tまでの文字を,char配列に格納しておけば,後から参照もできます.
ファイルがASCII文字だけから成るテキストファイルだと仮定した場合の,大雑把な流れ
1つ前の\t(または行の先頭)の直後から次の\tまでの文字を,char配列に格納しておけば,後から参照もできます.
ファイルがASCII文字だけから成るテキストファイルだと仮定した場合の,大雑把な流れ
- char配列bufを定義
- 1バイト読み取る
- ファイル終端ならループを抜ける
- 読み取った文字が\tまたは\nならbufを使って処理する(ついでにbufを空にする)
- 読み取った文字がその他の文字なら,bufに追加する
- 2 - 5を繰り返す.
-
学生の嘆き
Re: win32apiのReadFileについての質問
素人的な質問ですみません。
「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;
}
「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;
}
Re: win32apiのReadFileについての質問
読み取った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)
代入していますが、大丈夫ですか?
>ReadFile(hFile , str , lstrlen(str) , &readsize , NULL);
初期状態でstrは全て0で初期化されているので、lstrlen(str)==0であり、全く読み込まれないと思います。
lstrlen(str)→sizeof(str)だと思います。
>if(str[4096] = 0x0a)
代入していますが、大丈夫ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: win32apiのReadFileについての質問
ReadFileの説明が書かれた資料をちゃんと読んでますか?まさか,何も資料を読んでいない?学生の嘆き さんが書きました:「2.1バイト読み取る」とはどのようにデータを取得すればよいのでしょうか。
それから,ソースコードを貼るときは,codeタグで囲み,必ずプレビューしてOKかどうか確認してから投稿してください.
これはフォーラムルールです.
詳しくは投稿前チェックリストのチェック2とチェック3を御覧ください.