Ecrire un long fichier

Résolu
Utilisateur anonyme - 6 nov. 2007 à 21:25
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 8 nov. 2007 à 20:36
Bonjour,

Existe-t il un moyen "simple" de créer un fichier texte d'environ 1000 lignes ?

Parce qu'avec la fonction TEXT, on ne peut pas dire que ce soit vraiment très pratique entre les retours à la ligne, les guillemets, etc :

 DWORD d;
 HANDLE hfl3;
 hfl3=CreateFile("test.txt",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,NULL,NULL);
 WriteFile(hfl3, TEXT( "exemple" ), 8, &d, 0);

Peut-être avec une conversion en hexa ? Enfin bref j'en sais rien...

Merci pour une petite piste.

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2007 à 23:30
Que vient faire TEXT() dans WriteFile ???

WriteFile(hfile, addrBuffer, nbrOctetsBufferAecrire, &dwDiraNbrVraimentEcrits, 0);

ciao...
BruNews, MVP VC++
3
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
6 nov. 2007 à 23:51
Pour le retours a la ligne sous windows c'est \r\n

HANDLE hFile;
DWORD bw, Len;
char Text[] = "Il était une fois\r\nune marchande de foies\r\nqui vendait du foie\r\ndans la ville de foix.\r\nElle se dit ma foi\r\nc'est la dernière fois\r\nque je vends du foie\r\ndans la ville de foix.\r\nTon tonton tond ton tonton\r\nSi ton tonton tond ton tonton\r\nton tonton sera tondu.\r\nEtc ... un texte de1000 lignes\0";
Len = strlen(Text);
hFile = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
WriteFile(hFile, Text, Len, &bw, 0);
CloseHandle(hFile);

Neo_Fr
3
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
6 nov. 2007 à 21:52
Salut,
Un petit exemple:

HANDLE hFile;
DWORD bw, Len, i = 1;
char Line[] = "exemple\r\n\0";
Len = strlen(Line);
hFile = CreateFile("C:\\test.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
while(1)
{
WriteFile(hFile, Line, Len, &bw, 0);
if(i == 1000) break;
i++;
}
CloseHandle(hFile);

Neo_Fr
0
Utilisateur anonyme
6 nov. 2007 à 22:15
Arff, je me suis mal exprimé excuses-moi Neo_fr. En fait je ne cherche pas à écrire1000 lignes d'une même phrase ou d'un même mot dans un fichier texte, je cherche à insérer 1000 lignes d'un texte existant. Ou si tu préfères j'ai un bloc de 1000 lignes à écrire dans un fichier texte.
0

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

Posez votre question
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
6 nov. 2007 à 23:14
J'ai pas tres bien compris, tu veux lire 1000 lignes d'un fichier et les copier dans un autre fichier?

Neo_Fr
0
Utilisateur anonyme
6 nov. 2007 à 23:29
non pas les lire, les écrire dans un fichier. Imagines un parchemin de 1000 lignes.

 DWORD d;
 HANDLE hfl3;
 hfl3=CreateFile("test.txt",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,NULL,NULL);
 WriteFile(hfl3, TEXT( "Il était une fois
                                     une marchande de foies
                                      qui vendait du foie
                                       dans la ville de foix.
                                       Elle se dit ma foi
                                        c'est la dernière fois
                                        que je vends du foie
                                        dans la ville de foix.
                                        Ton tonton tond ton tonton
                                        Si ton tonton tond ton tonton
                                        ton tonton sera tondu.
                                        Etc ... un texte de1000 lignes), 8, &d, 0);                           
0
Utilisateur anonyme
7 nov. 2007 à 00:10
Ok merci Neo. Effectivement c'est plus orthodoxe comme ceci (bien qu'avec text() ça fonctionnait aussi )

Par contre il n'existe pas une technique ou astuce qui éviterait de se "taper" le bloc de 1000 lignes à la mano ? On est obligé d'en passer par là ?
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
7 nov. 2007 à 01:22
Remplace InFile par ton fichier a convertir..

DWORD __stdcall NbLines(char* FileName)
{
HANDLE hFile;
DWORD FileSize 0, pBuff 0, Lines = 0, br;
BYTE* Buff;
hFile = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return 0;
FileSize = GetFileSize(hFile, 0);
if(FileSize == INVALID_FILE_SIZE) goto Error;
Buff = HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, FileSize+1);
if(!Buff) goto Error;
if(!ReadFile(hFile, Buff, FileSize, &br, 0)) goto Error;
while(1)
{
if(Buff[pBuff] == 0x0D) Lines++;
if(pBuff == FileSize) break;
pBuff++;
}
Error:
if(Buff) HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, Buff);
if(hFile) CloseHandle(hFile);
return Lines;
}

int main(void)
{
const char InFile[] = "C:\\in.txt\0";
const char OutFile[] = "C:\\out.txt\0";
HANDLE hFile;
DWORD FileSize 0, pBuff 0, ls = 0, Lines, br, bw;
DWORD CrLf = 0x6E5C725C; // \r\n
BYTE* Buffer;
Lines = NbLines(InFile);
hFile = CreateFile(InFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return 1;
FileSize = GetFileSize(hFile, 0);
if(FileSize == INVALID_FILE_SIZE) goto Error;
Buffer = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY, (FileSize+(Lines*2))+1);
if(!ReadFile(hFile, Buffer, FileSize, &br, 0)) goto Error;
if(FileSize != br) goto Error;
CloseHandle(hFile);
hFile = CreateFile(OutFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
while(1)
{
if(Buffer[pBuff] == 0x0D)
{
if(!WriteFile(hFile, &Buffer[pBuff-ls], ls, &bw, 0)) goto Error;
if(!WriteFile(hFile, &CrLf, 4, &bw, 0)) goto Error;
pBuff++; ls = -1;
}
if(pBuff == FileSize) break;
pBuff++; ls++;
}
Error:
if(Buffer) HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, Buffer);
if(hFile) CloseHandle(hFile);
return 0;
}

Neo_Fr
0
Utilisateur anonyme
7 nov. 2007 à 23:08
Je n'ai pas réussi à compiler ton code Neo mais ce n'est pas grave : je vais utiliser un traitement de texte à la place ;)


En tout cas un grand merci pour ton aide (vivement que j'atteigne 20 % de tes connaissances :)) 
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
8 nov. 2007 à 20:36
Suffit juste de creer un nouveau projet console, tu colle le code de mon dernier post sans oublier de mettre "#include <windows.h>" tout en haut du code et tu compile, sous devcpp ca marche nikel...

Si ti arrive vraiment pas:
http://dl.free.fr/cuAmZsRjz/Project1.exe

Neo_Fr
0
Rejoignez-nous