SORU
17 AĞUSTOS 2010, Salı


C satırı ile dosya satır okumak

Bu fonksiyonu bir dosyadan bir satır okumak için yazdım

const char *readLine(FILE *file) {

    if (file == NULL) {
        printf("Error: file pointer is null.");
        exit(1);
    }

    int maximumLineLength = 128;
    char *lineBuffer = (char *)malloc(sizeof(char) * maximumLineLength);

    if (lineBuffer == NULL) {
        printf("Error allocating memory for line buffer.");
        exit(1);
    }

    char ch = getc(file);
    int count = 0;

    while ((ch != '\n') && (ch != EOF)) {
        if (count == maximumLineLength) {
            maximumLineLength  = 128;
            lineBuffer = realloc(lineBuffer, maximumLineLength);
            if (lineBuffer == NULL) {
                printf("Error reallocating space for line buffer.");
                exit(1);
            }
        }
        lineBuffer[count] = ch;
        count  ;

        ch = getc(file);
    }

    lineBuffer[count] = '\0';
    char line[count   1];
    strncpy(line, lineBuffer, (count   1));
    free(lineBuffer);
    const char *constLine = line;
    return constLine;
}

İşlevi doğru dosyayı okur ve basit bir beşgen kullanmaktır kullanarak constLine dize doğru olarak okumak yaptığını görüyorum.

Eğer bu işlev örneğin kullanırsam ancak:

while (!feof(myFile)) {
    const char *line = readLine(myFile);
    printf("%s\n", line);
}

printf anlamsız çıkışlar. Neden?

CEVAP
17 AĞUSTOS 2010, Salı


Eğer senin görevin değil icat, satır satır okuma fonksiyonu, ama sadece okumak için dosyayı satır satır kullanabilirsiniz tipik bir kod parçacığı içeren getline() fonksiyon (bakınız El Kitabı, Sayfa http://linux.die.net/man/3/getline):

   #define _GNU_SOURCE
   #include <stdio.h>
   #include <stdlib.h>

   int
   main(void)
   {
       FILE * fp;
       char * line = NULL;
       size_t len = 0;
       ssize_t read;

       fp = fopen("/etc/motd", "r");
       if (fp == NULL)
           exit(EXIT_FAILURE);

       while ((read = getline(&line, &len, fp)) != -1) {
           printf("Retrieved line of length %zu :\n", read);
           printf("%s", line);
       }

       fclose(fp);
       if (line)
           free(line);
       exit(EXIT_SUCCESS);
   }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Film Riot

    Film Riot

    16 NİSAN 2006
  • SegaAmerica

    SegaAmerica

    5 Mart 2008
  • THELIFEOFPRICE

    THELIFEOFPRI

    16 Mart 2011