Accueil > Forum > > > > Lecture d'un fichier txt
Lecture d'un fichier txt
samedi 20 octobre 2007 à 10:29:44 |
Lecture d'un fichier txt

Darklecon
|
Chers amis de la troisième lettre de l'alphabet bonjour,
J'ai écrit une petite fonction, copy_rep, permettant de copier un répertoire temp vers un autre répertoire. Copy_rep (toto), mettant les fichiers dan le répertoire toto marche très bien avec des ligne ressemblant à celle-ci :
char rep_base[55]="D:\\Medias\\";
strcat (rep_base, mot2);
char creer_repb[70]="md ";
strcat (creer_repb,rep_base);
Bref, la chose marche pour le mieux, ce que je désire pouvoir faire pour communiquer avec un logiciel qui s’appelle R, c’est de pouvoir lire le nom du répertoire dans un fichier txt. J’ai alors écrits ce bout de programme pour lancer ma fonction :
FILE *stream;
char *fich;
stream = fopen("D:\\Medias\\temp\\mot.txt", "r");
fscanf(stream,"%c",fich);
fclose(stream);
Malheureusement, ce que la fonction lit dans le fichier n’a pas l’aire de marcher avec ce qu’elle lit… Et je ne suis point apte à comprendre pourquoi…
Merci d’avance Christophe
P.S. J’ai déjà écrit ce message et je m’excuse s’il y a eu un problème avec.,.
|
|
samedi 20 octobre 2007 à 12:18:11 |
Re : Lecture d'un fichier txt

juju12
|
J'espère que tu alloues de la mémoire à fich avant de l'utiliser...sinon quand tu fais fscanf tu lui indiques %c ce qui signifie un seul caractère il me semble, faudrait plutôt utiliser %s.
|
|
samedi 20 octobre 2007 à 12:30:08 |
Re : Lecture d'un fichier txt

Darklecon
|
Oui merci, j'avoue que j'ai essayé plein de chose et j'avais essayé le %s mais le bug ne viens pas de là, dslé...
|
|
samedi 20 octobre 2007 à 14:27:14 |
Re : Lecture d'un fichier txt

SAKingdom
|
fscanf s'arrête au premier espace rencontré je crois. Essais d'utiliser fread. Pour connaitre la taille du fichier, utilise fseek et ftell. C++ (@++)
|
|
samedi 20 octobre 2007 à 14:43:07 |
Re : Lecture d'un fichier txt

Neo_Fr
|
Salut,
Si tu veux lire une ligne ds un fichier:
DWORD __stdcall ReadLine(DWORD nLine, char* FileName, char* LineOut)
{
HANDLE hFile;
BYTE* Buffer;
DWORD FileSize, LineSize = 0, pBuff = 0, ln = 0, br;
hFile = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return 0;
FileSize = GetFileSize(hFile, 0);
Buffer = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, FileSize+1);
ReadFile(hFile, Buffer, FileSize, &br, 0);
if(br != FileSize) goto End;
while(1)
{
if(Buffer[pBuff] == 0x0A)
{
ln++;
if(ln == nLine) break;
LineSize = 0;
}
if(pBuff == FileSize) break;
pBuff++; LineSize++;
}
if(Buffer[pBuff] == 0x0A) Buffer[pBuff-1] = 0x00;
LineSize--;
pBuff -= LineSize;
memcpy(LineOut, &Buffer[pBuff], LineSize);
End:
CloseHandle(hFile);
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, Buffer);
return LineSize;
}
Dans ton cas tu fais:
char Line[MAX_PATH+4];
ReadLine(Le_Numero_de_la_ligne, "C:\\tonfichier.xxx", Line);
Neo_Fr
|
|
samedi 20 octobre 2007 à 15:50:07 |
Re : Lecture d'un fichier txt

SAKingdom
|
Ben non. On ne peut pas réouvrir, réallouer la mémoire, relire le fichier et renaviguer à partir du début du buffer à chaque fois que l'on veut extraire une ligne. Ça prendra un temps fou. Effectuer ces traitements sur un buffer contenant déjà tout le fichier serait plus judicieux je crois. C++ (@++)
|
|
samedi 20 octobre 2007 à 16:16:09 |
Re : Lecture d'un fichier txt

Neo_Fr
|
Réponse acceptée !
Version optimisé:
typedef struct _openl
{
HANDLE hFile;
BYTE* Buffer;
DWORD FileSize;
}OPENL, *LPOPENL;
LPOPENL __stdcall OpenLine(char* FileName)
{
LPOPENL lpoLine;
DWORD br;
lpoLine = (LPOPENL) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, sizeof(OPENL));
lpoLine->hFile = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
if(lpoLine->hFile == INVALID_HANDLE_VALUE) return;
lpoLine->FileSize = GetFileSize(lpoLine->hFile, 0);
lpoLine->Buffer = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, lpoLine->FileSize+1);
ReadFile(lpoLine->hFile, lpoLine->Buffer, lpoLine->FileSize, &br, 0);
return (LPOPENL) lpoLine;
}
DWORD __stdcall ReadLine(LPOPENL lpoLine, DWORD nLine, char* LineOut)
{
DWORD LineSize = 0, pBuff = 0, ln = 0, br;
while(1)
{
if(lpoLine->Buffer[pBuff] == 0x0A)
{
ln++;
if(ln == nLine) break;
LineSize = 0;
}
if(pBuff == lpoLine->FileSize) break;
pBuff++; LineSize++;
}
if(lpoLine->Buffer[pBuff] == 0x0A) lpoLine->Buffer[pBuff-1] = 0x00;
LineSize--;
pBuff -= LineSize;
memcpy(LineOut, &lpoLine->Buffer[pBuff], LineSize);
return LineSize;
}
void __stdcall CloseLine(LPOPENL lpoLine)
{
CloseHandle(lpoLine->hFile);
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpoLine->Buffer);
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpoLine);
}
LPOPENL lpoLine;
char Line[MAX_PATH+4];
lpoLine = OpenLine("C:\\ton_fichier.xxx);
ReadLine(lpoLine, Le_numero_de_la_ligne, Line);
//...
CloseLine(lpoLine);
Voila..
Neo_Fr
|
|
samedi 20 octobre 2007 à 16:41:34 |
Re : Lecture d'un fichier txt

SAKingdom
|
Ouffff.... c'est compliqué ton truc. Voici la version la plus simple que j'ai pu faire.
char *GetLine (char *lpDest, char *lpBuffer, UINT *piSize, UINT iLine) { char *pDest, *pFinalPos, *pBeg;
// if(!buffer || !piSize || !buffer_size) return 0;
pFinalPos = lpBuffer+*piSize; pDest = lpDest;
while(iLine > 0) { while(*lpBuffer != '\r' && *lpBuffer != '\n') if(++lpBuffer >= pFinalPos) return 0;
lpBuffer++; if(*lpBuffer == '\n') lpBuffer++; iLine--; }
pBeg = lpBuffer;
while(*lpBuffer != '\r' && *lpBuffer != '\n') { if(lpBuffer >= pFinalPos) break; *pDest++ = *lpBuffer++; }
*piSize = lpBuffer-pBeg; *pDest = 0;
return pBeg; }
int main (int argc, char *argv[]) { char *lpBuffer, lpLine[50]; HANDLE hFile; DWORD dwSize;
hFile = CreateFile("d:\\test.txt", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hFile != INVALID_HANDLE_VALUE) { dwSize = GetFileSize(hFile, 0); lpBuffer = VirtualAlloc(0, dwSize, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
if(lpBuffer) { if(ReadFile(hFile, lpBuffer, dwSize, &dwSize, 0)) { // On commence à compter à partir de 0 // On extrait donc la seconde ligne if(GetLine(lpLine, lpBuffer, &dwSize, 1)) printf("%s\nTaille: %d\n", lpLine, dwSize); }
VirtualFree(lpBuffer, 0, MEM_RELEASE); }
CloseHandle(hFile); }
return 0; }
Le paramètre piSize est bidirectionnel. Il prend en entré la taille de lpBuffer et contient en sortie la taille de lpDest (moins le 0 de fin de chaine).
|
|
samedi 20 octobre 2007 à 16:47:39 |
Re : Lecture d'un fichier txt

SAKingdom
|
En passent, cette version de GetLine est fait pour lire des fichiers au format windows c'est à dire avec des saut de ligne au format \r\n. Petite correction: lpBuffer++; if(*lpBuffer == '\n') lpBuffer++; est inutile. À remplacer par lpBuffer += 2; Aussi dans les 2 while(*lpBuffer != '\r' && *lpBuffer != '\n') Pas nécessaire de tester si le caractère egal '\n' C++ (@++)
|
|
samedi 20 octobre 2007 à 16:56:42 |
Re : Lecture d'un fichier txt

Neo_Fr
|
Réponse acceptée !
int main(void)
{
char Ligne[MAX_PATH+4];
LPOPENL lpoLine;
lpoLine = OpenLine("C:\\test.txt"); // On ouvre le fichier et on le charge...
ReadLine(lpoLine, 1, Ligne); // On charge la ligne 1
printf("%s\n", Ligne); // On l'affiche
ReadLine(lpoLine, 2, Ligne); // On charge la ligne 2
printf("%s\n", Ligne); // On l'affiche
// etc..
CloseLine(lpoLine); // On referme et on libere..
system("PAUSE");
return 0;
}
Plus simple que ca c'est pas possible =)
Neo_Fr
|
|
Cette discussion est classée dans : fichier, répertoire, txt, stream, rep
Répondre à ce message
Sujets en rapport avec ce message
compter le nombres de fichier dans un rep d'un poste distant [ par brioche31 ]
Bonjour je dois compter le nombres de fichier dans le répertoire c:\temp d'une listes de postes distants écrit dans le fichier texte machines.txt et
fichier txt HELP !!!!!!!! [ par 3463 ]
Salut !! Merci d'avance pour votre aide : /*Récupération et lecture du tableau en .txt*/ float INPUT[nbredemesures]; FILE*ReadInput;
Lecture dans un fichier.txt entre deux dates [ par gzangel ]
Bonjour à tous, j'ai un gros soucis, j'essaie d'écrire un mini jeux de roulette sur console et je souhaiterais lire le contenant d'un fichier stats.t
detecter la présence d'une image dans un fichier txt [ par snakeissat ]
bonjour, j'utilise une fonction pour convertir un fichier RTF en txt [code=cs] path = @"C:\temp\BC.rtf"; System.Windows.Forms.RichTextBox rtBox =
extraire des données d'un fichier .txt [ par granbapt ]
Bonjour, Je suis très débutant en C et après avoir regardé différents tuto et forums je n'ai toujours pas trouvé la solution à mon problème. J'ai de
Modification virgule fichier .txt [ par necromoine ]
Bonjour, je souhaite faire un code qui permet de mettre un retour à la ligne apres chaque virgule d'un fichier texte, qui ressemblerait à : Contenu t
boucle fopen [ par vercd7am ]
Bonjour, j'aurai aime savoir comment faire un boucle de fopen. Voila pour l'instant ce que j'ai [code=cpp]FILE* fichier = NULL; // nombre de points
recuperer le contenu d'un CEdit en fichier .txt [ par manyyy67 ]
Bonjour, Je debute en c++, je suis charger des faire quelque ameliorations sur un (gros) programme professionel en c++(le IE est visual C++ 6 et le pr
Livres en rapport
|
Derniers Blogs
SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet [ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS.[ #SHAREPOINT 2013 ] LES MODèLES DE SITES STANDARDS. par Patrick Guimonet
C'est un point peu mis en avant mais SharePoint 2013 a été l'occasion de remettre de l'ordre dans les modèles de sites. Tout d'abord, un certain nombre de modèles ont été tout simplement rendus obsolètes (cf. Fonctionnalités déco...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
QUESTION QUESTION par wouroudkouka
Cliquez pour lire la suite par wouroudkouka PB PACMAN C++PB PACMAN C++ par garfield95
Cliquez pour lire la suite par garfield95
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|