2016-03-22 20 views
-1

Bazı verilerden bir dosyadan okumaya çalışıyorum (en nihayetinde bir yapıya, ancak şimdilik önemli değil) ve bu dosyanın her biri için eşit miktarda veriye sahip olduğundan emin olmak için hat. Her satırda kelimeler veya sayılar olabilir, bu yüzden bir satırın bir satırını büyük bir dizeye dönüştürdüm. Sonra bu dizgeyi strtok ve virgülleri (verileri ayıran) sınırlayıcı olarak kullanarak tokenlere bölmeyi denerim. Ancak, virgüller arasında var olan belirteçlerin miktarını nasıl sayabilirim. Her satırdaki virgüllerin miktarını saymayı denedim ama nedense beklediğim gibi davranmıyor. Dosyadaki her satırın tümü 5 parça veriye sahiptir, hepsi virgülle bölünür, bu yüzden her satırda 4 virgül olmalıdır. Bir dosyanın her bir satırındaki öğe miktarı nasıl sayılır

while (fgets(string, sizeof(string), f)) { 
    input = fgetc(f); 
     if(input == ','){ 
      i++;   
     } 
     else if (input == ' '){ 
      printf("Error"); 
      exit(0); 
     } 
    } 

    if(i % 4 != 0){ 
     printf("Error"); 
     exit(0); 
    } 

İşte ben her satırda virgül miktarını saymaya çalışıyorum (ve dosya hattında bir boşluk gidecekseniz eğer SADECE verileri bölünmesi virgül istediğiniz gibi, bu bir hata göstermelidir). Sonunda, fantastikler okumayı bıraktıktan sonra, "i" değişkeninin 4'lük bir katı olup olmadığını görmek istiyorum. Bunu yapmak için daha verimli ve kullanıcı dostu bir yol var eminim ama bir tane düşünemiyorum.

Hızlı soru da: komutların geri kalanı devam etmeden önce, satırdaki tüm karakterleri fgetc çalıştırıyor mu, yoksa virgülle karşılaşıldığında, programım bir sonraki döngüde mi hareket edecek?

Teşekkür ederiz!

+1

'fgets (string, sizeof (string), f)' 'string' ile okunan veriler kullanılmaz. Bu senin niyetin mi? – chux

+2

Neden hem 'fgets()' * ve * 'fgetc()' kullanıyorsunuz? – EOF

+0

virgüllerin bir satırda sayılmasının ve bir alanın üzerine çıkmanın basit bir yolu, satırdaki gibi yinelemektir: 'size_t commaCount = 0; (size_t i = 0; string [i]; i ++) {if (',' == string [i]) {commaCount ++; } else ('' == string [i]) {// boşluk nedeniyle iptal et}} ' – user3629249

cevap

0

Dosyanın her satırında virgül saymak için dosyanızda tam satır sınırlayıcısını bilmeniz gerekir. Sonra, dosya sonuna ulaşana ve satırlar içinde virgülleri sayıncaya kadar dosya üzerinde yineleyebilirsiniz.

Aşağıdaki örnekte, varsa, '\ n' bir satır sınırlayıcısıdır.

#define DESIRED_COMMAS_COUNT 4 
int commas_per_line = 0; 
bool prev_is_comma = false; 
int c; 
while ((c = fgetc(f)) != EOF) //This expression reads one characters from file and checks for end-of-file condition 
{ 
    switch(c) 
    { 
    case ',': 
     commas_per_line++; 
     if (prev_is_comma) 
     { 
     printf("Two successive commas! Empty element in line\n"); 
     exit(1); 
     } 
     prev_is_comma = true; 
     if (commas_per_line > DESIRED_COMMAS_COUNT) 
     { 
     printf("Error: too many commas at line. At least %d.\n", commas_per_line); 
     exit(1); 
     } 
     break; 
    case ' ': 
     printf("Error: space encountered!\n"); 
     exit(1); 
    case '\n': 
     if (commas_per_line != DESIRED_COMMAS_COUNT) 
     { 
     printf("Error: too low commas (%d)", commas_per_line); 
     exit(1); 
     } 
     if (prev_is_comma) 
     { 
     printf("Line ends with comma: no last element in line\n"); 
     exit(1); 
     } 
     commas_per_line = 0; 
     break; 
    default: 
     prev_is_comma = false; 
    } 
} 
if ((commas_per_line != DESIRED_COMMAS_COUNT) && //check commas count for last line in file 
    (commas_per_line != 0)) 
{ 
    printf("Error: too low commas (%d)", commas_per_line); 
    exit(1); 
} 
+0

1) okumadan önce, 'commaCount' 4'ünü eşit olmayan bir 'ekleyebilirsiniz'), dosya sonu kontrol etmek için 'feof()' kullanarak çok kötü bir fikirdir çünkü bu cevap işe yaramadığından Varsayarak. 2) 'fgetc()' 'int'' 'char' döndürür. 3) öneri: 'int c; iken ((c = fgetc())! = EOF) – user3629249

İlgili konular