2010-03-03 16 views
10

C'deki bir dosyadan bir kerede bir satırı okumak için hangi yöntem kullanılabilir?C çizgisinde bir kerede bir satır okuma

fgets işlevini kullanıyorum, ancak çalışmıyor. Sadece boşluk bırakılmış alanı okuyor.

Ne yapmalı?

+0

Yani gerçekten bir satır okumak istemiyorsunuz, bir boşluk ile karşılaşıncaya kadar okumak ister misiniz? Yoksa, yeni hatlar yerine, flotların boşlukta durduğunu mu söylüyorsun? –

+0

yalnızca yeni satır karakterinde durmalıdır. –

+0

İşte benim Girdi :: BAŞLANGIÇ A DC 10 B DS 20 DUR aldığım :: BAŞLAT A B DUR benim çıkış .. –

cevap

12

Bazı nedenlerden dolayı fgets() kullanamadığınızda bu işe yarar.

int readline(FILE *f, char *buffer, size_t len) 
{ 
    char c; 
    int i; 

    memset(buffer, 0, len); 

    for (i = 0; i < len; i++) 
    { 
     int c = fgetc(f); 

     if (!feof(f)) 
     { 
     if (c == '\r') 
      buffer[i] = 0; 
     else if (c == '\n') 
     { 
      buffer[i] = 0; 

      return i+1; 
     } 
     else 
      buffer[i] = c; 
     } 
     else 
     { 
     //fprintf(stderr, "read_line(): recv returned %d\n", c); 
     return -1; 
     } 
    } 

    return -1; 
} 
+0

thanx arkadaşının wokring'i ama yine de bir sorunum var .. Arabam, numaralı hattın tamamını okuyor ve yazdırıyor. sadece ilk boşluk parçalanmış simge sadece –

+0

Bu garip, ben sadece 'printf ("% s \ n ", buffer) kullanabilirim;' ve tüm tamponunu – LukeN

+0

yeh, benim için de tuhaf olarak çıkarır. önceki tüm programlar için çalışıyordu çünkü ...: '( –

2

fgets()

+0

sürece tampon – Tom

+0

yeterince Tom büyük olduğu gibi : Tamponun aşırı yüklenmesini önlemek için ikinci parametre budur. Yoksa yeterince büyük bir tampon öngörmüyor mu demek istiyorsun? IIRC, C derleyicimin tek tek satırlarda 512 bayt sınırı var. –

+0

Hangi C derleyici bu? Ve hattın ne kadar uzun olduğunu bilmediğin durumda düşünüyorum, örneğin stdin. Bunun üzerine kutsal bir savaş başlatmaya çalışmak değil. – Tom

7

fgets fonksiyon numfgets geçirilen ikinci parametre olan bir dosya veya num karakterden tek bir satır okuyacak ... gitmek için yol olmalıdır. Çizgiyi okumak için yeterince büyük bir numara mı geçiyorsunuz?

Örnek

için
// Reads 500 characters or 1 line, whichever is shorter 
char c[500]; 
fgets(c, 500, pFile); 

Vs.

// Reads at most 1 character 
char c; 
fgets(&c,1,pFile); 
+0

evet. Arabamın uzunluğu 100'dür. Bu yüzden yeterli olduğunu tahmin ediyorum .. –

+0

Dizi değişkeninin yanlış beyanı! – t0mm13b

+0

@JaredPar: Soğuk! Sen tamir ettin! : P Hey, 0'dan -1'e düştükten sonra reddettim, daha sonra onu düzeltmek için onu reddettim, sıfıra geri getirmek için, bunun yerine 1'e atladım ... tarayıcım mı yoksa bir aksaklık mı? – t0mm13b

2

Eğer çizgiler tampon uyması ya da mevcut GNU C kütüphanesi olan bir platform için kodlama yapıyorsanız okuma

3

Bu tam bir cevap daha fazla bir yorum, ama yorum yapmak için yeterli puanı yok. :)

İşte fgets() için fonksiyon prototip:

char *fgets(char *restrict s, int n, FILE *restrict stream); 

Bu n-1 bayt okumak veya bir satır veya eof kadar olacaktır. Daha fazla bilgi için bkz. here

2

Kullanım fgets ... Burada sonsuza satırı okuma bir örnek .... okumaya devam etmek yeni satır veya sonu hattına kadar çiğnemek getc(...) kullanmak sonra hattan okuyacak ve

 
// Reads 500 characters or 1 line, whichever is shorter 
char c[500], chewup; 
while (true){ 
    fgets(c, sizeof(c), pFile); 
    if (!feof(pFile)){ 
     chewup = getc(pFile); // To chew up the newline terminator 
     // Do something with C 
    }else{ 
     break; // End of File reached... 
    } 
} 
16

Satırı bir dosyadan almak için aşağıdaki programı kullanın. Hata

#include <stdio.h> 
int main (void) 
{ 
    char filename[] = "file.txt"; 
    FILE *file = fopen (filename, "r"); 

    if (file != NULL) { 
    char line [1000]; 
    while(fgets(line,sizeof line,file)!= NULL) /* read a line from a file */ { 
     fprintf(stdout,"%s",line); //print the file contents on stdout. 
    } 

    fclose(file); 
    } 
    else { 
    perror(filename); //print the error message on stderr. 
    } 

    return 0; 
} 
0

Kaynak:

Aslında benim hatam .. Bu durumda değildi. Strtok işlevini kullanıyordum ve orijinal orijinal dizgemi kazayla değiştirdim. Ben hata bana Helping için ...

Teşekkür Herkes .. :) başlamıştı baskı yaparken Dolayısıyla

-1

Sen fgets yerine fscanf kullanabilirsiniz. Fscanf, fscanf, boşluklar dahil olmak üzere, karakterler için fscanf Çünkü bir dosyaya kaydedilen verilere ayrı olarak erişebilirsiniz.Adı, ad sınıfı rulosuna sahip bir dosya var.Şimdi bir dize ve iki tam sayı satırı belirtin.

İlgili konular