Indexer des mots

mapinfo Messages postés 8 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 3 janvier 2008 - 29 déc. 2007 à 17:09
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 3 janv. 2008 à 16:14
Bonjour,

Voici un texte, je voudrais écrire
un code en C, qui affiche par exemple que le mot vraiment se situe en ligne 2,
c'est-à-dire , vraiment : [2]. Je pense l'écrire avec structure et typedef, je
voudrais bien une assistance pour bien m'éclairer, voire comprendre et toute
suggestion est la bien venue. Merci


<!-- BEGIN TEMPLATE: bbcode_quote -->


Un
programme qui tourne bien, c'est un plaisir, mais un
programme qui marche mal
ou pas du tout, c'est vraiment
une (grosse) frustration. La solution c'est de
le coder par
petits bouts, en testant progressivement chaque
expression
pour avoir la certitude qu'elle retourne bien la
valeur
attendue, avant de s'en servir dans une expression plus
large,
autrement dit une "instruction" du programme. On
teste alors chaque
instruction avec le contexte voulu, ce
qui, progressivement, garantit le bon
fonctionnement global.



<!-- END TEMPLATE: bbcode_quote -->


Pour les
autres mots, l'éxecution du programme donne ce résultat.


<!-- BEGIN TEMPLATE: bbcode_quote -->


alors
: [8]
attendue : [6]
autrement : [7]
avant : [6]
avec : [8]
avoir
: [5]
bien : [1, 5]
bon : [9]
bouts : [4]
ce : [8]
certitude :
[5]
chaque : [4, 8]
coder : [3]
contexte : [8]
dit :
[7]
expression : [4, 6]
fonctionnement : [9]
frustration :
[3]
garantit : [9]
global : [9]
grosse : [3]
instruction : [7,
8]
large : [7]
mal : [2]
marche : [2]
petits : [4]
plaisir :
[1]
programme : [1, 2, 7]
progressivement : [4, 9]
qu'elle :
[5]
retourne : [5]
s'en : [6]
servir : [6]
solution : [3]
testant
: [4]
teste : [8]
tourne : [1]
tout : [2]
valeur : [5]
voulu :
[8]
vraiment : [2]



<!-- END TEMPLATE: bbcode_quote -->


Cordialement


<!-- / message -->

10 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
29 déc. 2007 à 19:17
Et bien il faut que tu scannes ton texte en comptant le nombre de délimiteurs de ligne (CR sûrement, code ASCII 13) jusqu'à tomber sur le mot souhaité...
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
29 déc. 2007 à 20:06
Tu peux utiliser cette source pr lire tes lignes:
http://www.cppfrance.com/codes/WIN32-LIRE-FICHIER-LIGNE-LIGNE_44453.aspx

Ensuite utilise cette fonction:
LPSTR __stdcall StrSearch(LPSTR Str, LPSTR ToSearch)
{
DWORD StrLen 0, ToSearchLen 0, i = 0;
StrLen = strlen(Str);
ToSearchLen = strlen(ToSearch);
while(1)
{
if(Str[i] == ToSearch[0])
{
if(!memcmp(Str, ToSearch, ToSearchLen)) break;
}
if(i++ == StrLen) break;
}
return &Str[i];
}

Neo_Fr
0
mapinfo Messages postés 8 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 3 janvier 2008
30 déc. 2007 à 16:51
Bonsoir,


Je n'ai pas compris ton code source pour lire le fichier ilgne par ligne, expliquez-moi ce qu'il est fait (main.c et le Readline.c), le role de chaque fonction. Il y a beaucoup de choses que je n'arrive pas à comprendre, elles sont nouvelles pour moi.
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
31 déc. 2007 à 10:11
Ne t'occupe pas du code, tout ce que tu as a faire c'est d'inclure ReadLine.c et ReadLine.h dans ton projet, dans ton main.c met #include "ReadLine.h"

Cet exemple lit les 10 premiere ligne de 'szFileName':

#define LINE_MAX_SIZE 512

char szFileName[] = "C:\\ton_fichier.txt";
BYTE Buffer[LINE_MAX_SIZE]; // Le Buffer qui contiendra la ligne
DWORD i;
LPOPENL lpoLine;
lpoLine = OpenLine(szFileName, GetTypeOfFile(szFileName)); // On ouvre le ficier.
for(i=1; i<=10; i++)
{
ReadLine(lpoLine, i, Buffer); // On lit la ligne 'i' et on la met dans la variable 'Buffer'
printf("Ligne(%i) = %s\n", i, Buffer); // On l'affiche..
}

//Quand on a fini on appelle CloseLine:
CloseLine(lpoLine);

Neo_Fr
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mapinfo Messages postés 8 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 3 janvier 2008
2 janv. 2008 à 17:21
Bonsoir,

Voilà, j'utilise in IDE (code::Blocs), j'ai créé un projet index, puis dans les sources, j'ai écris les fichiers suivants (main.c et ReadLine.c). Dans les headers, j'ai écris le fichier ReadLine.h. Expliquez-moi comment je peux intégrer mon fichier de texte (index) qui contient neuf lignes pour qu'il puisse être lu. Comment compiler et exécuter tous ces fichiers, sachant que je n'ai pas un seul fichier, si c'était le cas, je sais comment compiler et exécuter un seul fichier sous code::Blocs( Build et Run). Tous ce que je veux savoir maintenant, c'est comment faire pour que mon fichier texte soit lu ligne par ligne, l'intégrer parmi tous ces fichiers, c'est-à-dire lors de la compilation et l'exécution, soit reconnu et qu'il fait parti de mon projet et finalement, il affiche ce que je vous ai montré tout au début, exemple :
petits : [4]
plaisir : [1]
programme : [1, 2, 7]

mapinfo
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
2 janv. 2008 à 22:12
dans ton projet tu doit avoir main.c, ReadLine.c et ReadLine.h,
met ca dans ton fichier main.c:
#incude <windows.h>
#include <stdio.h>
#include "ReadLine.h"

#define LINE_MAX_SIZE 512
char szFileName[] = "C:\\ton_fichier.txt"; // met le chemin de ton fichier ici

int main(void)
{
BYTE Buffer[LINE_MAX_SIZE]; // Le Buffer qui contiendra la ligne
DWORD i;
LPOPENL lpoLine;
lpoLine = OpenLine(szFileName, GetTypeOfFile(szFileName)); // On ouvre le ficier.
for(i=1; i<=10; i++)
{
ReadLine(lpoLine, i, Buffer); // On lit la ligne 'i' et on la met dans la variable 'Buffer'
printf("Ligne(%i) = %s\n", i, Buffer); // On l'affiche..
}
system("PAUSE");
return 0;
}

Voila cet exemple te lira les 10 premiere lignes de ton fichier, maintenant que tu sais comment lire le fichier ligne par ligne a toi de faire le reste..

Neo_Fr
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
2 janv. 2008 à 22:13
Et met CloseLine(lpoLine); juste avant system("PAUSE");

Neo_Fr
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
2 janv. 2008 à 22:13
Et met CloseLine(lpoLine); juste avant system("PAUSE");

Neo_Fr
0
mapinfo Messages postés 8 Date d'inscription mercredi 10 janvier 2007 Statut Membre Dernière intervention 3 janvier 2008
3 janv. 2008 à 14:33
Bonjour,
Voilà, j'ai appliqué ce que tu m'as indiqué. j'ai mis dans mon projet les trois fichiers suivants: main.c, ReadLine.c et ReadLine.h. Mon fichier texte s'appelle indexe-moi, j'ai mis le chenin de mon fichier. Je travaille avec code::blocks et non pas avec dev C++, donc je n'ai pas besoin de system("pause");
Voici main.c
#include <windows.h>
#include <stdio.h>
#include "ReadLine.h"



#define LINE_MAX_SIZE 512
char szFileName[] = "C:\Documents and Settings\Mes documents\Informatique\Python\indexe-moi.txt"; // met le chemin de ton fichier ici



int main(void)
{
    BYTE Buffer[LINE_MAX_SIZE]; // Le Buffer qui contiendra la ligne
    DWORD i;
    LPOPENL lpoLine;
    lpoLine = OpenLine(szFileName, GetTypeOfFile(szFileName)); // On ouvre le ficier.
    for(i=1; i<=10; i++)
    {
        ReadLine(lpoLine, i, Buffer); // On lit la ligne 'i' et on la met dans la variable 'Buffer'
        printf("Ligne(%i) = %s\n", i, Buffer); // On l'affiche..
    }
    CloseLine(lpoLine);
    return 0;
}






ReadLine.c


#include "ReadLine.h"



LPOPENL __stdcall OpenLine(char* FileName, BYTE FileType)
{
LPOPENL lpoLine;
lpoLine = (LPOPENL) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, sizeof(OPENL));
ZeroMemory(lpoLine, sizeof(OPENL));
lpoLine->hFile = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
if(lpoLine->hFile == INVALID_HANDLE_VALUE) goto Error;
lpoLine->FileSize = GetFileSize(lpoLine->hFile, 0);
if(lpoLine->FileSize == INVALID_FILE_SIZE) goto Error;
lpoLine->hFileMapping = CreateFileMapping(lpoLine->hFile, 0, PAGE_READONLY, 0, 0, 0);
if(!lpoLine->hFileMapping) goto Error;
lpoLine->Buffer = (BYTE*) MapViewOfFile(lpoLine->hFileMapping, FILE_MAP_READ, 0, 0, 0);
if(!lpoLine->Buffer) goto Error;
lpoLine->FileType = FileType;if((FileType OPENL_WINDOWS_FILE)||(FileType OPENL_MAC_FILE)) lpoLine->CrLf = 0x0D;if(FileType OPENL_UNIX_FILE) lpoLine->CrLf 0x0A;
return (LPOPENL) lpoLine;
Error:
CloseLine(lpoLine);
return (LPOPENL) 0;
}



DWORD __stdcall ReadLine(LPOPENL lpoLine, DWORD nLine, char* LineOut)
{DWORD LineSize 0, pBuff 0, ln = 0;
if(!nLine) return 0;if(nLine >lpoLine->LastLine) pBuff lpoLine->pFile;
while(1)
{
if(lpoLine->Buffer[pBuff] == lpoLine->CrLf)
{
ln++;
if(ln == nLine) break;
LineSize = 0;
}
if(pBuff == lpoLine->FileSize) break;
pBuff++; LineSize++;
}



if( (lpoLine->FileType == OPENL_WINDOWS_FILE)&&(pBuff != LineSize) ) LineSize -= 2;
if( (lpoLine->FileType == OPENL_UNIX_FILE)&&(pBuff != LineSize) ) LineSize--;
if( (lpoLine->FileType == OPENL_MAC_FILE)&&(pBuff != LineSize) ) LineSize--;
pBuff -= LineSize;
if(LineOut)
{
memcpy(LineOut, &lpoLine->Buffer[pBuff], LineSize);
LineOut[LineSize] = 0;
lpoLine->pFile = pBuff;
lpoLine->LastLine = nLine;
}
return LineSize;
}



void __stdcall CloseLine(LPOPENL lpoLine)
{
if(lpoLine->Buffer)UnmapViewOfFile(lpoLine->Buffer);
if(lpoLine->hFileMapping) CloseHandle(lpoLine->hFileMapping);
if(lpoLine->hFile) CloseHandle(lpoLine->hFile);
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpoLine);
}



int __stdcall GetTypeOfFile(char* FileName)
{
HANDLE hFile;
BYTE* Buffer;DWORD FileSize 0, Cr 0, Lf = 0, pBuff = 0, br;
int RetValue = -1;
hFile = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return RetValue;
FileSize = GetFileSize(hFile, 0);
if(FileSize == INVALID_FILE_SIZE) goto End;
Buffer = (BYTE*) VirtualAlloc(0, FileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if(!Buffer) goto End;
if(!ReadFile(hFile, Buffer, FileSize, &br, 0)) goto End;
if(br != FileSize) goto End;
while(1)
{
if(Buffer[pBuff] == 0x0D) Cr++;
if(Buffer[pBuff] == 0x0A) Lf++;
if(pBuff == FileSize) break;
pBuff++;
}if(Cr Lf) RetValue OPENL_WINDOWS_FILE;
if( (!Cr) && (Lf) ) RetValue = OPENL_UNIX_FILE;
if( (Cr) && (!Lf) ) RetValue = OPENL_MAC_FILE;
End:
if(Buffer) VirtualFree(Buffer, 0, MEM_RELEASE);
CloseHandle(hFile);
return RetValue;
}





ReagLine.h
#ifndef _WINDOWS_
#define _WIN32_WINNT 0x0501
#include <windows.h>
#endif





#define OPENL_WINDOWS_FILE 0
#define OPENL_UNIX_FILE 1
#define OPENL_MAC_FILE 2
#define BufferSize 0x200000 //2mo





typedef struct _openl
{
HANDLE hFile;
HANDLE hFileMapping;
BYTE* Buffer;
BYTE FileType;
BYTE CrLf;
DWORD FileSize;
DWORD pFile;
DWORD LastLine;
}OPENL, *LPOPENL;





LPOPENL __stdcall OpenLine(char* FileName, BYTE FileType);
DWORD __stdcall ReadLine(LPOPENL lpoLine, DWORD nLine, char* LineOut);
void __stdcall CloseLine(LPOPENL lpoLine);
int __stdcall GetTypeOfFile(char* FileName);



Lors de la compilation , il m'affiche




Build: Release in index ---------------





Target is up to date.




Nothing to be done.

Lors de l'exécution, il m'affiche la console de windows noir, avec seulement le temps d'exécution, rien d'autres. Aidez-moi SVP
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
3 janv. 2008 à 16:14
Dans szFileName remplace tous les \ par \\, si ca ne marche tjrs pas essaye ca:
http://Neo_Fr.fr.nf/ReadLine.zip

Neo_Fr
0
Rejoignez-nous