Ajuster contenu de fichier avec lignes de longueur fixe

Signaler
Messages postés
2
Date d'inscription
vendredi 6 octobre 2006
Statut
Membre
Dernière intervention
18 septembre 2008
-
Messages postés
2
Date d'inscription
vendredi 6 octobre 2006
Statut
Membre
Dernière intervention
18 septembre 2008
-
Sujet: réalisation d'un programme qui ajuste sur chaque ligne de longueur fixe un fichier en entrée

En entrée:
- FIC_IN: fichier ascii avec des lignes de tailles variables de n caractères (ex de fichier ci-dessous entre guillemets)
       exemple: "1234567890abcdefghij0987654321ABCDEFGHIJ"
- LENGTH :entier (représentant une longueur de taille fixe que l'ont veut ajuster)
       exemple: 10

=> résultat attendu (découpage où se trouvent les "/": "1234567890/abcdefghij/0987654321/ABCDEFGHIJ"

En sortie:
- FIC_OUT: fichier avec sur chacune des lignes le contenu du fichier FIC_IN ajuster sur 10 caractères
        "1234567890
        abcdefghij
        0987654321
        ABCDEFGHIJ"Comment le réaliser en C ? (contraintes supplémentaires: FIC_IN peut avoir une taille en dizaines de Mo et il faudrait que la durée d'execution du programme soit en secondes   :-)) )

Merci à ceux qui m'aideront à faire ce petit utilitaire.

SKO

3 réponses

Messages postés
14958
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
26 mai 2020
91
Hello,
Quel est ton souci exactement:
- Lecture/Ecriture de fichier?
- Comptage des caractères?

Je te rappelle (cf point 9) que tu ne trouveras pas ici de code tout cuit: nous sommes là pour aider et non pour travailler pour les autres...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
Un exemple coder vite fait, a toi de l'adapter a tes besoins...

DWORD __stdcall SetFileLineLength(LPSTR lpszInFile, LPSTR lpszOutFile, DWORD dwLineLength)
{
HANDLE hInFile, hOutFile;
DWORD dwRET = 1, br, bw, i, l;
LPBYTE lpData, lpIn, lpOut;
lpData = (BYTE*) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, 0x300000); // 3mo
if(!lpData) return 1;
hInFile = CreateFile(lpszInFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
if(hInFile == INVALID_HANDLE_VALUE) goto _Error;
hOutFile = CreateFile(lpszOutFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hOutFile == INVALID_HANDLE_VALUE) goto _Error;
while(1)
{
if(!ReadFile(hInFile, lpData, 0x100000, &br, 0)) goto _Error;
if(!br) break;
i = br;
l = dwLineLength;
lpIn = lpData;
lpOut = (lpData + 0x100000);
do
{
if( (*lpIn != '\r')&&(*lpIn != '\n') )
{
*lpOut++ = *lpIn;
if(!--l)
{
*((WORD*) lpOut)++ = '\r\n';
l = dwLineLength;
}
}
lpIn++;
}while(i--);
i = lpOut - (lpData+0x100000);
if(!WriteFile(hOutFile, (lpData+0x100000), i, &bw, 0)) goto _Error;
}
dwRET = 0;
_Error:
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpData);
if(hInFile) CloseHandle(hInFile);
if(hOutFile) CloseHandle(hOutFile);
return dwRET;
}

Neo_Fr
Messages postés
2
Date d'inscription
vendredi 6 octobre 2006
Statut
Membre
Dernière intervention
18 septembre 2008

Merci,
Je vais intégrer le code de Neo_Fr pour voir sa perf.
J'ai également identifié la commande fold sous unix/linux (syntaxe: # fold -w nb_car fic_in > fic_out)
Cette commande répond promptement à mon besoin (pour connaitre l'algo il me faudra trouver le code source, ce qui ne devrait pas être un grand pb)
Ce sujet est clos.
SKO