Bonjour,

Je souhaiterais parser un fichier ligne par ligne et recupérer chaque ligne de ce fichier qui contient deux pattern.

par exemple si j'ai le fichier suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
mot1 mot2 mot3 mot4
mot5 mot2 mot6 mot3
mot2 mot8 mot9 mot3
...
en sortie dans un vector de structure j'imagine, j'aimerais récupérer les infos suivantes par rapport au fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
mot2 mot3 //de la premiere ligne
mot2 mot3 //dela deuxiemen ligne
mot2 mot3  //de la troisieme ligne
...
le résultat se trouvait dans un vector:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
struct mots
{
 std::string _mot1;
 std::string _mot2;
}
 
std::vector<mots> _vectMot;
C'est faisable en c/c++ en utilisant les strstr, strncpy, strcpy mais c'est trop lourd, le fichier fait environ 2Mo.

J'utilise visual studio 2013 sous windows x64, je pensait utiliser boost, qui doit le faire en quelques lignes.

boost récupérerait directement dans un vector la ligne qui match les deux patterns.

Ou bien spliter le fichier ligne par ligne dans un vector et faire un strstr, mais pas terrible.

par exemple dans le code suivant je recupere dans buffer la ligne qui correspond a un mot se trouvant ds la variable m_szFilter, je trouve le code un peu pourri:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
	if ((filename == NULL) || ((int)strlen(filename) == 0)) return false;
 
	char *BufFile = NULL;
	HANDLE hFile;
	ULONG numread;
	ULONG nLen = 0;
	TCHAR szLineFilter[TEXTBUFSIZE];
 
	hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
 
	if(hFile == INVALID_HANDLE_VALUE)
	{		
		return false;
	}
 
	if((nLen = GetFileSize(hFile, 0)) == 0)
	{
		CloseHandle(hFile);
		return false;	
	}
 
	if((BufFile = new char[nLen+1]) == 0)
	{
		CloseHandle(hFile);
		return false;	
	}	
 
	if((buffer = new char[nLen+1]) == 0)
	{
		CloseHandle(hFile);
		return false;	
	}
 
	ReadFile(hFile, BufFile, nLen, &numread, 0);	
	BufFile[nLen] = '\0';
 
	ULONG nLine = 0;
	ULONG nCurIndex = 0;
	ULONG nPos = 0;
	ULONG i;
	ULONG nTotalBytes = 0;
	ULONG nRead = 0;
 
	for(i = 0; i < nLen; )
	{
		if(BufFile[i] == '\r') //Next line
		{
			// carriage-return / line-feed combination
			if(BufFile[i+1] == '\n')
				i++;
 
			nLine = ++i; //Index next line			
 
			strncpy_s(szLineFilter, TEXTBUFSIZE, &BufFile[nCurIndex], nLine - nCurIndex);
			if (strstr(szLineFilter, m_szFilter)) //Filter found
			{				
				nRead = nLine - nCurIndex;
				memcpy(buffer + nTotalBytes, szLineFilter, nRead);
				nTotalBytes += nRead;
				nCurIndex = nLine;
			} else nCurIndex = nLine;						
		}
		else if(BufFile[i] == '\n') //Next line
		{
			nLine = ++i;	
 
			strncpy_s(szLineFilter, TEXTBUFSIZE, &BufFile[nCurIndex], nLine - nCurIndex);
			if (strstr(szLineFilter, m_szFilter)) //Filter found
			{				
				nRead = nLine - nCurIndex;
				memcpy(buffer + nTotalBytes, szLineFilter, nRead);
				nTotalBytes += nRead;
				nCurIndex = nLine;
			} else nCurIndex = nLine;			
		}
		else
		{
			i++;
		}
 
		if(i >= nLen) //Last read
		{
			nLine = i;			
			strncpy_s(szLineFilter, TEXTBUFSIZE, &BufFile[nCurIndex], nLine - nCurIndex);
			if (strstr(szLineFilter, m_szFilter)) //Filter found
			{				
				nRead = nLine - nCurIndex;
				memcpy(buffer + nTotalBytes, szLineFilter, nRead);	
				nTotalBytes += nRead;
			} 		
		}
 
	}
 
	buffer[nTotalBytes] = '\0';	
	length = (ULONG)strlen(buffer);
 
	CloseHandle(hFile);	
	delete[] BufFile;
	BufFile = 0;
je pense toujours qu'avec boost, des ifstream ou des osstream ca doit etre faisable. j'utilise deja boost pour les regex uniquement.

si quelqu'un aurait une piste ou une idee avec boost.

Merci de votre aide.