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ı?
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ı?
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;
}
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 –
Bu garip, ben sadece 'printf ("% s \ n ", buffer) kullanabilirim;' ve tüm tamponunu – LukeN
yeh, benim için de tuhaf olarak çıkarır. önceki tüm programlar için çalışıyordu çünkü ...: '( –
fgets()
sürece tampon – Tom
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. –
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
fgets
fonksiyon num
fgets
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);
evet. Arabamın uzunluğu 100'dür. Bu yüzden yeterli olduğunu tahmin ediyorum .. –
Dizi değişkeninin yanlış beyanı! – t0mm13b
@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
Eğer çizgiler tampon uyması ya da mevcut GNU C kütüphanesi olan bir platform için kodlama yapıyorsanız okuma
üzerinde daha fazla kontrol için fgetc
kullanacağı biliyorsanız kullanımı ya fgets
kullanabileceğiniz get():
Bu fonksiyon aynı zamanda BSD sistemlerinde de mevcuttur, sadece bilgi için;) –
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
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... } }
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;
}
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
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.
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? –
yalnızca yeni satır karakterinde durmalıdır. –
İşte benim Girdi :: BAŞLANGIÇ A DC 10 B DS 20 DUR aldığım :: BAŞLAT A B DUR benim çıkış .. –