C satırı ile dosya satır okumak | Netgez.com
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

  • Ash100HD

    Ash100HD

    29 EKÄ°M 2011
  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • psidot

    psidot

    2 Kasım 2006