Utilisation de Fichiers txt en C++.net

zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 4 mai 2011 - 19 juil. 2008 à 00:03
zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 4 mai 2011 - 20 juil. 2008 à 16:27
Bonjour à tous,

j'ai deux questions :
- J'utilise visual c++.net express 2008, et je cherche à lire uniquement les dernières lignes d'un fichier txt très volumineux sans lire l'intégralité du fichier. Comment faire?
- J'ai une multitude de fichiers txt de noms divers que je voudrais "concaténer" en un seul gros fichier txt.

Pourriez vous m'aider?

Merci beaucoup.

7 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
19 juil. 2008 à 13:05
Salut,
En .Net j'en ai aucune idée mais en pure C ca donnerait ca:

DWORD __stdcall FileConcat(LPSTR lpszDstFile, LPSTR lpszSrcFile)
{
HANDLE hSrcFile, hDstFile;
DWORD dwRet = 1, dwFileSize, br, bw;
BYTE* lpBuffer;
hSrcFile = CreateFile(lpszSrcFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hSrcFile == INVALID_HANDLE_VALUE) return 1;
hDstFile = CreateFile(lpszDstFile, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
if(hDstFile == INVALID_HANDLE_VALUE) goto _Error;
lpBuffer = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, 0x100000); // 1mo
if(!lpBuffer) goto _Error;
dwFileSize = GetFileSize(hDstFile, 0);
SetFilePointer(hDstFile, dwFileSize, 0, FILE_BEGIN);
while(1)
{
if(!ReadFile(hSrcFile, lpBuffer, 0x100000, &br, 0)) goto _Error;
if(!br) break;
if(!WriteFile(hDstFile, lpBuffer, br, &bw, 0)) goto _Error;
}
dwRet = 0;
_Error:
if(lpBuffer) HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpBuffer);
if(hDstFile) CloseHandle(hDstFile);
if(hSrcFile) CloseHandle(hSrcFile);
return dwRet;
}

Neo_Fr
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
19 juil. 2008 à 16:20
BOOL FileConcat(LPSTR lpszDstFile, LPSTR lpszSrcFile)
{
    HANDLE hSrcFile, hDstFile;
    BOOL ret = FALSE;
    BYTE* lpBuffer;

    hSrcFile = CreateFile(lpszSrcFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
    if(hSrcFile != INVALID_HANDLE_VALUE) {
        hDstFile = CreateFile(lpszDstFile, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
        if(hDstFile != INVALID_HANDLE_VALUE) {
            if((lpBuffer = (BYTE*)HeapAlloc(GetProcessHeap(), 0, 0x100000))) { // 1mo
                SetFilePointer(hDstFile, 0, 0, FILE_END);

                while(1) {
                    DWORD dummy;

                    if(!ReadFile(hSrcFile, lpBuffer, 0x100000, &dummy, 0)) goto _Error;
                    if(!dummy) break;
                    if(!WriteFile(hDstFile, lpBuffer, dummy, &dummy, 0)) goto _Error;
                }

                ret = TRUE;

            _Error:
                HeapFree(GetProcessHeap(), 0, lpBuffer);
            }
            CloseHandle(hDstFile);
        }
        CloseHandle(hSrcFile);
    }

    return ret;
}

C++ (@++)<!--
0
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
19 juil. 2008 à 17:29
1) Utilise la class StreamReader et utilise la méthode Seek.
2) Pour lister tous les fichiers Directory.GetFiles(); qui renvoi un tableau de String.
0
zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 4 mai 2011
20 juil. 2008 à 00:24
ok merci,

j'ai rencontré plusieurs fois pour la méthode seek sur les forums mais je n'arrive pas à l'utiliser correctement.
L'aide de msdn donne :
FileStream^ fileStream = gcnew FileStream( fileName,FileMode::Create );
/.../
fileStream->Seek( 0, SeekOrigin::Begin );
le 0 spécifie le décalage,  s'agit-il du nombre de ligne de décalage? (je ne connais pas le nombre de ligne de mon fichier txt...)
SeekOrigin::Begin Spécifie le début, la fin ou la position actuelle en tant que point de référence pour origin.
Or j'ai besoin de récupérer les dix dernières lignes d'un fichier txt de nombre de ligne inconnu...

Pourriez vous m'aider avec un exemple ?

merci
0

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

Posez votre question
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
20 juil. 2008 à 10:21
Non le nombre qui indique le décalage est le nombre d'octets.
Comme je l'ai dis utilise plutôt la classe StreamReader puisque tu lis un fichier txt.
FileStream spécialisé dans la lecture d'octets.
StreamReader spécialisé dans la lecture de chaine de caractères.
0
zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 4 mai 2011
20 juil. 2008 à 16:16
J'ai essayé un truc avec les stream reader mais rien n'est finalement écris dans mon fichier resultat.txt.

StreamReader^ sr =
gcnew StreamReader(
"test.txt" );


StreamWriter^ sw = gcnew StreamWriter(
"result.txt");






sr->BaseStream->Seek(-1024,SeekOrigin::End);







while
(sr->Peek() >= 0){sw->WriteLine(sr->ReadLine());

}
0
zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 4 mai 2011
20 juil. 2008 à 16:27
J'ai trouvé readtoend qui me permet de lire jusqu'a la fin du fichier.
Mais en fait je ne peux pas lire les dernières lignes de mon fichier initial  il s'arrete avant d'arriver à la toute fin...


sr->BaseStream->Seek(-200004,SeekOrigin::End);



sw->WriteLine(sr->ReadToEnd());
0