begin process at 2013 05 23 00:30:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

Lecture d'un fichier txt


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
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

Membre Club
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

1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales