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

  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006