gcc und getline()

b0b

Member
Hallo ich lerne zur Zeit C und ich wollte folgenden Code übersetzen:

Code:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#define _GNU_SOURCE

int main(void)
{
  FILE *fd;
  char *stream = ".test.txt";
  int nRet;
  size_t *t = malloc(0);

  char **gptr = (char **)malloc(sizeof(char*));
  *gptr = NULL;

  if( (fd = fopen(stream, "r")) == NULL )
  {
    fprintf(stderr, "\nKonnte Datei %s nicht öffnen!", stream);
    return EXIT_FAILURE;
  } 
  while( (nRet = getline(gptr, t, fd)) > 0 )
    fputs(*gptr, stdout);
  return EXIT_SUCCESS;
}

und bekomme diese Fehlermeldung:

Code:
gcc -o getline getline.c

/var/tmp//cchZWZ5b.o(.text+0x97): In function `main':
: undefined reference to `getline'

Ich weiß, dass die Funktion getline nicht zu ANSI C gehört. Aber bei dem gcc dachte ich, dass die dabei sei. Oder ist der Syntax von getline falsch:

Code:
ssize_t getline (char **lineptr, size_t *n, FILE *stream);

Ich verwende FreeBSD 5.4-STABLE und den gcc in version 3.4.2.
Kann mit bitte jemand helfen, danke.
 
b0b schrieb:
Hallo ich lerne zur Zeit C und ich wollte folgenden Code übersetzen:

Code:
char **gptr = (char **)malloc(sizeof(char*));

Der Rückgabewert von void *malloc() wird nicht gecastet.
sizeof ist ein Operator, keine Funktion.
Vernünftigerweise läßt man sizeof die Größe der Variable bestimmen, nicht des Typs, also schreibst Du sizeof *gptr.

ciao, jtsn
 
@ teuk:
das ist leider nicht das getline, was ich suche. das getline auf der site hat als übergabewert nur den zeiger auf den speicherbereich in dem der user input gespeichert wird. das was ich benötige hat als ersten übergabeparameter den zeiger auf den zeiger der auf den anfang des puffers hinweist, als zweiten die größe des puffers und als dritten auf zeiger auf den stream.

ssize_t getline (char **lineptr, size_t *n, FILE *stream)

@ jtsn:
Zitat von jtsn:
Der Rückgabewert von void *malloc() wird nicht gecastet.
sizeof ist ein Operator, keine Funktion.
Vernünftigerweise läßt man sizeof die Größe der Variable bestimmen, nicht des Typs, also schreibst Du sizeof *gptr.

mir ist schon bekannt das sizeof ein operator ist.
sizeof(*gptr) -> würde nicht funktionieren, da *gptr noch nicht deklariert wurde.
selbst wenn es funktioniert würde man mit **malloc(sizeof(*gptr) nur soviel speicher angefordern werden wie für den wert benötigt wird auf den *qptr zeigt. aber wir
benötigen ja speicher für einen zeiger.
beweis:

char *p;
sizeof( *p ) = 1 Byte
sizeof( char* ) = 4 Byte (auf einem 32 bit system)

ich habe zwar erst mit c angefangen aber ich denke das ist so richtig.
 
b0b schrieb:
sizeof(*gptr) -> würde nicht funktionieren, da *gptr noch nicht deklariert wurde.
Falsch, wird es genau in dieser Zeile.
selbst wenn es funktioniert würde man mit **malloc(sizeof(*gptr) nur soviel speicher angefordern werden wie für den wert benötigt wird auf den *qptr zeigt.
Falsch
beweis:

char *p;
sizeof( *p ) = 1 Byte
sizeof( char* ) = 4 Byte (auf einem 32 bit system)
Das beweist was? gptr ist ein char**, kein char* wie p.
Der Typ von *gptr ist "Zeiger auf char". Ergo
Code:
sizeof(*gptr) == sizeof(char*)
 
Ich finde getline() nur in meinen C++ Headern.

Was willst Du ueberhaupt machen bzw. was soll Dir getline() abnehmen?
 
Hallo,

getline() ist nicht Teil des C Standards. Die Funktion kommt nur mit der GNU C Library mit. Ist daher also nicht 100% portabel.
 
Ich denke mittlerweile auch, dass es für BSD's keine Version von getline() gibt.

@ Tron:
Du hast recht. Ich habe wohl doch noch nicht hundertprozentig kapiert, wie Zeiger auf Zeiger und die Speicherreservierung mit malloc() funktioniert, sorry.
 
Zurück
Oben