テキストファイルより、任意の文字列を取得 – プログラミング – Home

テキストファイルより、任意の文字列を取...
 
通知
すべてクリア

テキストファイルより、任意の文字列を取得


がくせい
 がくせい
(@がくせい)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

開発環境:WinXP->VC6.0++->Win32 Application

テキストファイルに保存されている文字列の一部分だけ取得し
printf等で表示したいと思っています。

例えばですが
test.txtというファイル内に

あああいいいうううえええおおお

と書かれていたら
『ううう』の部分のみ取得し表示という事を実現したいと考えているのですが
ReadFileでどう設定したらいいのか判りません。。

知っている方いましたらご教授お願い致します。


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

抽出条件がわかりません。

- 3個連続した'う'?
- 'い'と'え'で挟まれた任意の文字?
- 7文字目からの3文字?
- それとも…?

いずれにせよ、'一行取り出して抽出条件に適合する部分を探し出す'を繰り返します。


返信引用
がくせい
 がくせい
(@がくせい)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

申し訳ございません。
抽出条件ですが毎回自分で設定する。
という形を取りたいと思っていたので、書いていませんでした。

>>'一行取り出して抽出条件に適合する部分を探し出す'

例えばですが、抽出条件が
:~:(コロンからコロン)の間の文字だけ取得したい場合には
どう探して抽出したら良いのでしょうか?


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

そのままでしょ。

頭から一文字づつコロンを探しながら読み飛ばし、
そこから一文字ずつコロンを探しながら文字を読み込む、とか。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

あるいは正規表現でしょうか。
Boost, ICUのおマケ(?)についてきます。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

便利なライブラリがほしいのであれば、
επιστημηさんが言われているように正規表現の検索が出来るような
ライブラリを探す。ネット上で検索すればそれらしいのは見つかると思います。

検索するロジックが知りたいならPAIさんが言われたように一文字一文字調べる
のが一番確実でしょうね。ただ、そういう条件をどうやって入力させるつもり
なのかなぁ。それこそ正規表現で入力させますか?
テキストファイルをメモリマップドファイルにして処理ってのもありそうですね。
検索そのものはループで回して先頭から一バイトずつチェックでしょうね。
その辺は、自分がそういうテキストファイルを与えられて、条件を提示されたら
どうやって探すか考えてみればわかると思います。
ファイルの先頭から目で追って探しますよね。
同じ事をプログラムにやらせるだけの話です。


返信引用
ppp
 ppp
(@ppp)
ゲスト
結合: 20年前
投稿: 6
 

初心者のコードでよければ
貴方の望む物に近いとおもわれ
#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;
} //無駄の多いコードですが、頑張って解読してね


返信引用
Bosscat
 Bosscat
(@Bosscat)
ゲスト
結合: 23年前
投稿: 73
 

そもそも、読まなきゃ探せない。

だから、ファイルは全部読んでしまったら?
(ReadFileでファイルサイズを指定する)
もちろんサイズ次第

その上でstrstr()でも呼べばよい。


返信引用
ぽけらった
 ぽけらった
(@ぽけらった)
ゲスト
結合: 20年前
投稿: 4
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました