Bonjour,
Voilà, j'ai appliqué ce que tu m'as indiqué. j'ai mis dans mon projet les trois fichiers suivants: main.c, ReadLine.c et ReadLine.h. Mon fichier texte s'appelle indexe-moi, j'ai mis le chenin de mon fichier. Je travaille avec code::blocks et non pas avec dev C++, donc je n'ai pas besoin de system("pause");
Voici main.c
#include <windows.h>
#include <stdio.h>
#include "ReadLine.h"
#define LINE_MAX_SIZE 512
char szFileName[] = "C:\Documents and Settings\Mes documents\Informatique\Python\indexe-moi.txt"; // met le chemin de ton fichier ici
int main(void)
{
BYTE Buffer[LINE_MAX_SIZE]; // Le Buffer qui contiendra la ligne
DWORD i;
LPOPENL lpoLine;
lpoLine = OpenLine(szFileName, GetTypeOfFile(szFileName)); // On ouvre le ficier.
for(i=1; i<=10; i++)
{
ReadLine(lpoLine, i, Buffer); // On lit la ligne 'i' et on la met dans la variable 'Buffer'
printf("Ligne(%i) = %s\n", i, Buffer); // On l'affiche..
}
CloseLine(lpoLine);
return 0;
}
ReadLine.c
#include "ReadLine.h"
LPOPENL __stdcall OpenLine(char* FileName, BYTE FileType)
{
LPOPENL lpoLine;
lpoLine = (LPOPENL) HeapAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, sizeof(OPENL));
ZeroMemory(lpoLine, sizeof(OPENL));
lpoLine->hFile = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
if(lpoLine->hFile == INVALID_HANDLE_VALUE) goto Error;
lpoLine->FileSize = GetFileSize(lpoLine->hFile, 0);
if(lpoLine->FileSize == INVALID_FILE_SIZE) goto Error;
lpoLine->hFileMapping = CreateFileMapping(lpoLine->hFile, 0, PAGE_READONLY, 0, 0, 0);
if(!lpoLine->hFileMapping) goto Error;
lpoLine->Buffer = (BYTE*) MapViewOfFile(lpoLine->hFileMapping, FILE_MAP_READ, 0, 0, 0);
if(!lpoLine->Buffer) goto Error;
lpoLine->FileType = FileType;
if((FileType == OPENL_WINDOWS_FILE)||(FileType == OPENL_MAC_FILE)) lpoLine->CrLf = 0x0D;
if(FileType == OPENL_UNIX_FILE) lpoLine->CrLf = 0x0A;
return (LPOPENL) lpoLine;
Error:
CloseLine(lpoLine);
return (LPOPENL) 0;
}
DWORD __stdcall ReadLine(LPOPENL lpoLine, DWORD nLine, char* LineOut)
{
DWORD LineSize = 0, pBuff = 0, ln = 0;
if(!nLine) return 0;
if(nLine >= lpoLine->LastLine) pBuff = lpoLine->pFile;
while(1)
{
if(lpoLine->Buffer[pBuff] == lpoLine->CrLf)
{
ln++;
if(ln == nLine) break;
LineSize = 0;
}
if(pBuff == lpoLine->FileSize) break;
pBuff++; LineSize++;
}
if( (lpoLine->FileType == OPENL_WINDOWS_FILE)&&(pBuff != LineSize) ) LineSize -= 2;
if( (lpoLine->FileType == OPENL_UNIX_FILE)&&(pBuff != LineSize) ) LineSize--;
if( (lpoLine->FileType == OPENL_MAC_FILE)&&(pBuff != LineSize) ) LineSize--;
pBuff -= LineSize;
if(LineOut)
{
memcpy(LineOut, &lpoLine->Buffer[pBuff], LineSize);
LineOut[LineSize] = 0;
lpoLine->pFile = pBuff;
lpoLine->LastLine = nLine;
}
return LineSize;
}
void __stdcall CloseLine(LPOPENL lpoLine)
{
if(lpoLine->Buffer)UnmapViewOfFile(lpoLine->Buffer);
if(lpoLine->hFileMapping) CloseHandle(lpoLine->hFileMapping);
if(lpoLine->hFile) CloseHandle(lpoLine->hFile);
HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, lpoLine);
}
int __stdcall GetTypeOfFile(char* FileName)
{
HANDLE hFile;
BYTE* Buffer;
DWORD FileSize = 0, Cr = 0, Lf = 0, pBuff = 0, br;
int RetValue = -1;
hFile = CreateFile(FileName, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
if(hFile == INVALID_HANDLE_VALUE) return RetValue;
FileSize = GetFileSize(hFile, 0);
if(FileSize == INVALID_FILE_SIZE) goto End;
Buffer = (BYTE*) VirtualAlloc(0, FileSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if(!Buffer) goto End;
if(!ReadFile(hFile, Buffer, FileSize, &br, 0)) goto End;
if(br != FileSize) goto End;
while(1)
{
if(Buffer[pBuff] == 0x0D) Cr++;
if(Buffer[pBuff] == 0x0A) Lf++;
if(pBuff == FileSize) break;
pBuff++;
}
if(Cr == Lf) RetValue = OPENL_WINDOWS_FILE;
if( (!Cr) && (Lf) ) RetValue = OPENL_UNIX_FILE;
if( (Cr) && (!Lf) ) RetValue = OPENL_MAC_FILE;
End:
if(Buffer) VirtualFree(Buffer, 0, MEM_RELEASE);
CloseHandle(hFile);
return RetValue;
}
ReagLine.h
#ifndef _WINDOWS_
#define _WIN32_WINNT 0x0501
#include <windows.h>
#endif
#define OPENL_WINDOWS_FILE 0
#define OPENL_UNIX_FILE 1
#define OPENL_MAC_FILE 2
#define BufferSize 0x200000 //2mo
typedef struct _openl
{
HANDLE hFile;
HANDLE hFileMapping;
BYTE* Buffer;
BYTE FileType;
BYTE CrLf;
DWORD FileSize;
DWORD pFile;
DWORD LastLine;
}OPENL, *LPOPENL;
LPOPENL __stdcall OpenLine(char* FileName, BYTE FileType);
DWORD __stdcall ReadLine(LPOPENL lpoLine, DWORD nLine, char* LineOut);
void __stdcall CloseLine(LPOPENL lpoLine);
int __stdcall GetTypeOfFile(char* FileName);
Lors de la compilation , il m'affiche
Build: Release in index ---------------
Target is up to date.
Nothing to be done.
Lors de l'exécution, il m'affiche la console de windows noir, avec seulement le temps d'exécution, rien d'autres. Aidez-moi SVP