開発環境:WinXP->VC6.0++->Win32 Application
テキストファイルに保存されている文字列の一部分だけ取得し
printf等で表示したいと思っています。
例えばですが
test.txtというファイル内に
あああいいいうううえええおおお
と書かれていたら
『ううう』の部分のみ取得し表示という事を実現したいと考えているのですが
ReadFileでどう設定したらいいのか判りません。。
知っている方いましたらご教授お願い致します。
抽出条件がわかりません。
- 3個連続した'う'?
- 'い'と'え'で挟まれた任意の文字?
- 7文字目からの3文字?
- それとも…?
いずれにせよ、'一行取り出して抽出条件に適合する部分を探し出す'を繰り返します。
申し訳ございません。
抽出条件ですが毎回自分で設定する。
という形を取りたいと思っていたので、書いていませんでした。
>>'一行取り出して抽出条件に適合する部分を探し出す'
例えばですが、抽出条件が
:~:(コロンからコロン)の間の文字だけ取得したい場合には
どう探して抽出したら良いのでしょうか?
そのままでしょ。
頭から一文字づつコロンを探しながら読み飛ばし、
そこから一文字ずつコロンを探しながら文字を読み込む、とか。
あるいは正規表現でしょうか。
Boost, ICUのおマケ(?)についてきます。
便利なライブラリがほしいのであれば、
επιστημηさんが言われているように正規表現の検索が出来るような
ライブラリを探す。ネット上で検索すればそれらしいのは見つかると思います。
検索するロジックが知りたいならPAIさんが言われたように一文字一文字調べる
のが一番確実でしょうね。ただ、そういう条件をどうやって入力させるつもり
なのかなぁ。それこそ正規表現で入力させますか?
テキストファイルをメモリマップドファイルにして処理ってのもありそうですね。
検索そのものはループで回して先頭から一バイトずつチェックでしょうね。
その辺は、自分がそういうテキストファイルを与えられて、条件を提示されたら
どうやって探すか考えてみればわかると思います。
ファイルの先頭から目で追って探しますよね。
同じ事をプログラムにやらせるだけの話です。
初心者のコードでよければ
貴方の望む物に近いとおもわれ
#include stdafx.h
#include <cstring>
#include <process.h>
#include <iostream>
using namespace std;
int main(void)
{
char *str1 = abc;
char *str2 = .txt;
int t,i,n,m,c;
n = strlen(str1);
m = strlen(str2);
t = n+m+1;
char *pm;
pm = new char [t];
for (i=0; i < n; i++){
pm[i] = str1[i];
printf(pm[%d] str1[%d]\n,i,i);
}
for (i=n; i < n+m; i++) {
pm[i] = str2[i-n];
printf(pm[%d] str2[%d]\n,i,i-n);
}
pm[t-1] = '\0';
char *str = pm;
printf(%s\n,str);
FILE *fp;
fp = fopen(str,r);
if (fp == NULL){
printf(file open failed\n);
delete [] pm;
return 0;
}
int count=0;
char *pf;
long position;
pf = new char[(int)fp];
memset( pf, 0,(int)fp);
while ((c = getc(fp)) != EOF) {
if (IsDBCSLeadByte(c) != 0) {
position = ftell( fp );
fseek(fp, 2,SEEK_CUR);
}
else if (c == ' ' || c == '='){
position = ftell( fp );
getc(fp);
position = ftell( fp );}
else if (c == '\n') {
putchar('\n');
pf[count] =(char)'\n';
count++;
} else {
putchar(c);
pf[count]=(char)c;
count++;
}
}
pf[count+1]= (char)'EOF';
fclose(fp);
fp = fopen(log.txt,a);
if (fp == NULL) {
printf(failed);
exit(-1);
}
fprintf(fp,%s,pf);
fprintf(fp,%c,'\n');
fclose(fp);
delete [] pm;
delete[] pf;
return 0;
} //無駄の多いコードですが、頑張って解読してね
そもそも、読まなきゃ探せない。
だから、ファイルは全部読んでしまったら?
(ReadFileでファイルサイズを指定する)
もちろんサイズ次第
その上でstrstr()でも呼べばよい。
CStringである文字列だけ収集するなどはこれなど使えますよ。
http://www.codeproject.com/string/splitstring.asp
ま、これはcsvファイル形式のファイルをわけるほうほうですが
poのデータを設定しなおせば、同じようなことができるかと。
例ですので参考になれば・・・:
abc.csvの中は
11111,2222
33333,4444
とかになってるとします。
CString listFileFullPath = abc.csv;
TRY
{
CParseOptions po( _T(','), _T('\'), _T('\0'), false, false, false );
CStringParser record;
CStdioFile* pFile = new CStdioFile();
pFile->Open( listFileFullPath, CFile::modeNoTruncate | CFile::modeRead );
CString strLine, strField;
int nLine = 0;
while( 1 )
{
if ( !pFile->ReadString( strLine ) )
{
break;
}
if ( strLine.GetLength() == 0 ) continue;
record.Parse( strLine, po );
aString = record.GetAt( 0 );
nString = record.GetAt( 1 );
TRACE(0=%s 1=%s\n,aString,nString);
nLine++;
}
pFile->Close();
delete pFile;
}
CATCH( CFileException, e )
{
e->ReportError();
}
AND_CATCH( CNotSupportedException, e )
{
e->ReportError();
}
END_CATCH