while (fgetc(wpisy)!='\n') i++;
fseek(wpisy,-i-2,1);
string = (char*)malloc(sizeof(char)*(i+1));
fread(string,sizeof(char),i,wpisy);
Troche nieelegancko, 2x czytać plik, i jeszcze fseek co linie. Dynamiczny bufor by sie zdał.
#include <stdio.h>
#define BUFF_SIZE 100 //dmyślny rozmiar bufora
#define BUFF_INCREMENT 50 //o ile zwiekszamy bufor w przypadku przepełnienia
//funkcja kopiuje "n" bajtów w nowozaalokowany blok pamięci
void *memdup(const void *src, size_t n)
{
return memmove(malloc(n), src, n);
}
//funkcja zwiękasza zaalokowany blok pamięci pomiędzy "begin" a "end" o "inc"
//bajtów i zwraca stary rozmiar
int incalloc(void **begin, void **end, size_t inc)
{
size_t size = *end - *begin;
*begin = realloc(*begin, size + inc);
*end = *begin + size + inc;
return size;
}
int main()
{
FILE* wpisy = fopen("c:\\a.txt", "rt");
//bufor na jedną linie tekstu
char* Buffer = malloc(BUFF_SIZE);
//wskaźnik końca buforu, wskazuje na pierwszy element ZA buforem
char* BuffEnd = Buffer + BUFF_SIZE;
//wskaźniki do wczytywanych linii (też można dynamicznie zmieniać jej rozmiar)
char* lines[255];
int num = 0; //numer wczytywanej linii
char* ch = Buffer; //wskaźmik do kolejnych bajtów bufora
while((*ch = fgetc(wpisy)) != EOF) //znaki czytane prosto do bufora
{
if(*ch == '\n')
{
*ch = '\0'; //zamiń znak '\n' na '\0'
lines[num++] = memdup(Buffer, ch - Buffer + 1); //skopiuj bufor
ch = Buffer; //powrót wskaźnika na początek bufora
}
else if(++ch == BuffEnd) //przepełnienie bufora
{
//alokuje nową pamięć dla bufora i ustawia wskaźnik ch na
//pierwszym dodatkowo zaalokowanym bajcie
ch = incalloc(&Buffer, &BuffEnd, BUFF_INCREMENT) + Buffer;
}
}
if(ch > Buffer) //gdy niepusta ostatnia linia
{
*ch = '\0'; //zamiń znak EOF na '\0'
lines[num++] = memdup(Buffer, ch - Buffer + 1);
}
free(Buffer);
int i;
for(i=0; i<num; i++)
{
printf("%s\n", lines[i]);
}
}