2016-04-03 17 views
0

Bellekte iki ardışık çizgi tutarken her satırdaki tüm girişi bir satırdan okur ve her satırı standart çıktıya yazdırırsa, void process_file(FILE* f) işlevini yazmam gerekir. önceden okunan çizgiye eşit değil.Bir önceki satıra eşit değilse her satırı yazdırın

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MY_MAX_LINE 999 

void process_file(FILE* f) 
{ 
    char firstLine[MY_MAX_LINE + 1]; 
    char secondLine[MY_MAX_LINE + 1]; 

    while (1) 
    { 
    if (!fgets(firstLine, sizeof(firstLine), f)) 
     break; 

    puts(firstLine); 

    if (!fgets(secondLine, sizeof(secondLine), f)) 
     break; 

    if (strncmp(firstLine, secondLine, sizeof(firstLine))) 
     puts(secondLine); 
    } 

    if (!feof(f)) 
    perror("Problem reading from file"), exit(1); 
} 

int main(int argc, char **argv) 
{ 
    FILE *f = fopen("text.txt", "r"); 

    if (!f) 
    perror("text.txt"), exit(1); 

    process_file(f); 
    fclose(f); 

    return 0; 
} 

Bunu doğru şekilde yapıp yapmadığımı ve bu soruyu soruyorsa, bilmek istiyorum.

Teşekkürler!

+2

Kullanıcı, bir satırda ve sonra aynı satırı iki kez yazdığında kodunuz çalışmaz. Sadece ilk ve ikinci satırlar aynıysa veya üçüncü ve dördüncü, beşinci ve altıncı, vb. – kichik

+1

Hayır, doğru değil. Örneğin, giriş "ABBC" ise, çıktı "ABC" olmalıdır, ancak kodunuz ABBC'yi çıkarır çünkü yalnızca "A" ile "B" yi ve ikinci "B" yi "C" olarak karşılaştırır. – user3386109

+1

Lütfen bkz. [Sor]. Programı çalıştırdığınızda ne alacaksın? – Olaf

cevap

1

İşte bunu nasıl yapacağım. İlk önce 2 satırlık bir dizi ile başlayın, böylece mevcut ve önceki satırları seçmek için dizinleri kullanabilirsiniz. Daha sonra iki dizin bildirmek için . İlk indeks, ping, mevcut hattın indeksidir. Diğer dizin, pong, bir önceki satırın indeksidir. pong, dosyadaki ilk satırın hiçbir öncülü olmadığından geçersiz bir dizine başlatıldı. yazdırmaya yazdırmak veya kullanmama:

int ping = 0;  // index of the current line 
int pong = -1; // index of the previous line 

Sonra Şimdi karar vermelisiniz akım hattı

while (fgets(line[ping], MAXL, fp) != NULL) 

içine dosyadan okumak için while döngü gerekir. Mevcut hattın basıldığı iki durum vardır. İlk olarak, pong < 0 ise hat ilk satırdır. İlk satır daima yazdırılır. İkincisi, eğer satır bir önceki çizgiyle uyuşmuyorsa (strcmp ile belirlenir), hat yazdırılır.

if (pong < 0 || strcmp(line[0], line[1]) != 0) 
    printf("%s", line[ping]); 

Son olarak, bir sonraki satıra hazırlamak için dizinleri güncellememiz gerekir. Dizinlerden birinin 0, diğerinin 1 olmasını istiyoruz ve döngü boyunca her geçişte yer değiştirmeleri gerekiyor. pong, önceki satırın indeksidir, bu yüzden geçerli satırın dizinini pong'a kaydediyoruz. Sonra ping'u 0'dan 1'e veya tersine çeviririz.

pong = ping; 
ping = 1 - ping; 
+0

'u kullanın, şimdi anladım ve anladım. –

İlgili konular