C'de tekrarlı dosyaya yazma

The_Türk

Hectopat
Katılım
3 Şubat 2020
Mesajlar
554
Çözümler
1
Yer
Türkiye
Selamlar. C'de amacım kulanıcıdan okunan veri önceden oluşturulan dosyadaki örneğiyle karşılaştırılacak. Örnek dosya oku.dosya:

Kod:
testkod = 1 aa
testkod = 2 ab
testkod = 3 ba
testkod = 4 bb

Eşleşirse cikti adında ayrı dosyaya duruma göre tek ya da sıralı şekilde yazdırılacak. Kodun dosyadan okuma, eşleştirme ve dosyaya yazan fonksiyonlarında hiçbir sorun yok. Mesela ben 3. satırı ara değişkeni içinde aradığımda ba karşılığını sorunsuz bir şekilde arıyor ve cikti dosyasına yazıyor:

Kod:
ba
ba
ba
ba
ba
ba
ba
ba
ba

Sorun şu ki tek seferde ya da 9 gibi küçük sayılar verdiğimde sorun çıkmıyor ama 9999 kez dosyaya yaz dediğimde Segmentation fault hatası alıyorum. BUFFER_SIZE değerini arttırdım ama işe yaramadı. buf ve key değişkenlerini her işlemden sonra free ve memset komutlarıyla sıfırladım ama yine işe yaramadı. Her seferinde 1 kez dosyaya yaz dememe rağmen yine hata alıyorum. Bir fikri olan var mı? Teşekkürler.

C:
#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE 1000

char key[255];
char buf[255];

char* get_key(char key_number[256]);
char* return_line(int line);
int indexOf(FILE *fptr, char *word, int *line, int *col);
int return_line_number(char *word);
int main(int argc, char** argv) {
        FILE *f;
        char ara[] = "3";
        f = fopen("cikti", "w");
        int i;
        //printf("%s", get_key(ara));
        for(i=0; i<9; i++) {
                if(strcmp(get_key(ara), "1") == 0)
                        fprintf(f, "aa\n");
                if(strcmp(get_key(ara), "2") == 0)
                        fprintf(f, "ab\n");
                if(strcmp(get_key(ara), "3") == 0)
                        fprintf(f, "ba\n");
                if(strcmp(get_key(ara), "4") == 0)
                        fprintf(f, "bb\n");
        }
        fclose(f);
        return 0;
}

char* get_key(char key_number[256]) {
        int d = 0;
        while(key[d]!=0) {
                key[d] = 0;
                d++;
        }
        int number_line;
        char word[256] = "testkod = ";
        strcat(word, key_number);
        //printf("%s\n", word);
        char line[256] = "";
        number_line = return_line_number(word);
        strcpy(line, return_line(number_line));
        //printf("%i\n", return_line_number(word));
        //printf("%s", line);
        int a = 0, b = 0;
        while(line[a]!='=') {
                //printf("%c", line[a]);
                a++;
        }
        a += 2;
        //printf("\n");
        while(line[a]!=' ') {
                key[b] = line[a];
                a++;
                b++;
        }
        //printf("%s\n", key);
        return key;
}

char* return_line(int line) {
        //printf("%i\n", line);
        int end, loop;
        FILE *fp = fopen("oku.dosya", "r");
        for(end=loop=0; loop<line; loop++) {
                if(0==fgets(buf, sizeof(buf), fp)) {
                        end = 1;
                        break;
                }
        }
        fclose(fp);
        if(!end)
                return buf;
}

int return_line_number(char *word) {
        int line; int col;
        FILE *fptr;
        fptr = fopen("oku.dosya", "r");
        return indexOf(fptr, word, &line, &col);
}

int indexOf(FILE *fptr, char *word, int *line, int *col) {
        char str[BUFFER_SIZE], *pos;
        *line = -1, *col  = -1;
        while ((fgets(str, BUFFER_SIZE, fptr)) != NULL) {
                *line += 1;
                pos = strstr(str, word);
                if (pos != NULL) {
                        *col = (pos - str);
                        break;
                }
        }
    if (*col == -1)
                *line = -1;
        return *line+1;
}
 
Bu kod, gördüğün gibi sadece bir defa dosyaya bastırıyor, onu da sen düzenleyebilirsin dostum. Başka birisinin kodunu incelemek ve o kodda küçük de olsa modifikasyonlar yapmak seni programlama konusunda geliştireceği için böyle yapıyorum.

[CODE lang="c" title="Kodla istediğin gibi oynayabilirsin."]#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE* handle;
char* prefix = "testkod = ";
int prefix_len = strlen(prefix);
char mode = '2';
char buf[prefix_len+6];
handle = fopen("oku.dosya","r");
while(fgets(&buf,sizeof(buf),handle) != NULL){
if(buf[prefix_len] == mode){
FILE* temp = fopen("cikti","w");
for(int idx = prefix_len+2; idx < sizeof(buf)-1; idx++){
fprintf(temp,"%c",buf[idx]);
}
fclose(temp);
break;
}
printf("%s\n",buf);
}
return 0;
}[/CODE]
 
Son düzenleme:
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı