Linia po linii z pliku - problem z fgets, wartość null

0
char *mainEntry(FILE *src, int mainEntryNum) {
        char buffer[50];
        int i;
	
	for (i = 0; i < mainEntryNum; ++i) fgets(buffer, 50, src);
	fgets(buffer, 50, src);
       
        return buffer;
}

Problem polega na tym, że funkcja zwraca null, lub całkowicie losowe dane. W moim zamyśle chciałbym przejść do linii numer mainEntryNum wczytac wiersz do tablicy buffer i zwrocic. Z góry dziękuję za pomoc. Pozdrawiam

0

static char buffer[50];

0

Niestety dalej nie działa :( Tym razem zwraca pusty napis

0

To pokaż cały kod, jeżeli zastosowałeś to co powiedziałem to powinno działać. Mam nadzieje że pamiętasz że zwrócony napis przeważnie będzie zawierał '\n' ?

0

<code = c>
// main
...

    linesNum = countLines(src);
    mainEntryNum = rand() % linesNum + 1;
    printf("%d, %d\n", linesNum, mainEntryNum);
printf("%s\n", mainEntry(src, mainEntryNum));

    ...

}

int countLines(FILE *src) {
int count = 0;
char c;

    while ((c = getc(src)) != EOF)
            if (c == '\n') count++;

    return count;

}

char *mainEntry(FILE *src, int mainEntryNum) {
static char buffer[50];
int i;

for (i = 1; i < mainEntryNum; ++i) fgets(buffer, 50, src);
fgets(buffer, 50, src);
   
    return buffer;

}</code

linesNum jest wartością poprawną, "printf("%s\n", mainEntry(src, mainEntryNum));" drukuje pusty wiersz

0
        linesNum = countLines(src);
        fseek(src,0,SEEK_SET);
        mainEntryNum = rand() % linesNum + 1;

Wlaściwie możesz ten wiersz wstawić na początki mainEntry.

0

no i działa :) dzięĸuje ci bardzo, jeszcze żebym to wiedział dlaczego tak a nie inaczej. Czyżby chodziło o to, że poprzednia funkcja ustawiła w pewnym miejscu wskaźnik określający pozycję w pliku i musieliśmy go z powrotem ustawić na początku?

0

tak, funkcja licząca wiersze zostawiała wskaźnik na końcu pliku.
Masz jeszcze kilka błędów:

  1. return count+(poprzedni_znak!='\n'); // ostatnim znakiem w zmiennej c będzie EOF, (przy okazji c powinna być typu int) zaś poprzedni musisz zapamiętać wewnątrz pętli.
  2. static bufor - nie jest dobrym rozwiązaniem, powinieneś bufor zadeklarować w main a do funkcji przekazać char *mainEntry(FILE *src,char *bufer,int bufersize, int mainEntryNum)
  3. jeżeli wiersz będzie dłuższy niż 49 znaków to fgets() wczyta pierwsze 49 czyli liczenie może być niepoprawne, pomijaj wiersze tak jak zrobiłeś w countLines()
  4. jeżeli bufor wczytano przez fgets() a będzie krótszych od tych 50 znaków to w buforze znajdzie się również '\n' który należy usunąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1