C Programlama dilinde txt dosyasından veri nasıl alınır?

msaexe

Hectopat
Katılım
17 Şubat 2021
Mesajlar
39
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar merhaba C programlama dilinde bir ödevim var, ödevi kendim yapmak istediğim için sadece ihtiyacım olan kısmı sormak istiyorum. Elimdeki txt dosyasında örneğin 12+5 yazıyor program + 'dan öncesini ve sonrasını algılayıp toplayacak. Örneğin: 2+5+7 sorusunu metin belgesine yazacağız program sonucu konsola yazdıracak.
 
Merhaba,

Telefondan yazıyorum IDE'den yazım hatası var mi bakarsınız bir. Aşağıdaki şekilde sizin işinize yarayabilir. Printf yerine yapmak inte çevirip başka bir değişkende toplamaniz yeterli olur.

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

int main() {
char string[]= "2+4+8";
char * x = strtok(string, "+");
while(x != NULL) {
printf("%s\n",x);
x = strtok(NULL, "+");
}
}
 
Attıklarınızı inceledim fakat yapamadım, ödevim bu şekilde tavsiyeniz var mı?
 

Dosya Ekleri

  • Ekran Alıntısı.PNG
    Ekran Alıntısı.PNG
    60,9 KB · Görüntüleme: 46
Merhaba,

Telefondan yazıyorum IDE'den yazım hatası var mı? Bakarsınız bir. Aşağıdaki şekilde sizin işinize yarayabilir. Printf yerine yapmak inte çevirip başka bir değişkende toplamaniz yeterli olur.

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

İnt main() {
Char string[]= "2+4+8";
Char * X = strtok(string, "+");
While(X!= null) {
printf("%s\n",x);
X = strtok(null, "+");
}
}

Hocam düşündüm de strtok fonksiyonunu kullanmak daha akıllıca, siz doğru yapmışsınız ama dosya okumayı unutmuşsunuz.
 
Aşağıda txt veya dat dosyasından okuma yapabilecek kodu paylaşıyorum. Sanırım dosyayı basit bir veri tabanı olarak kullanmanız gerekiyor. Bunun için dosya içerisindeki kayıtları "+", "tab" vb. bir seperatörle bölün. Aşağıdaki şekilde her bir satırı dosyadan çekin, akabinde bir önceki mesajımda olduğu gibi belirlediğiniz seperatöre göre ayrıştırın. Bu ayrıştırma işlemi esnasında 2d dizi oluşturmanızı tavsiye ederim (dizi oluşturmanız için önceden dosyanın satır sayısını saydırın, zaten kolon sayınız sabit olacak, oraya hard code olarak kolon sayınızı girebilirsiniz). Eğer dizi oluşturmaya karar verirseniz, return 0 öncesine veri tabanı olarak kullandığınız dosyanın içini temizleme ve yeni diziyi yapıştırma kodlarını eklemeniz gerekir (Oluşabilecek hataları bertaraf etmek için dosyayı kapatıp, adını değiştirin, 2d dizinizi aynı isimde bir dosya oluşturup içerisine atın, aşağıdaki dosya bulunamadı koşulunu bu durumda dosya bulunamazsa backup olarak kullandığınız dosyadan verilerin gelmesi olarak değiştirebilirsiniz o durumda return 1 sadece backup dosyasını da bulamaması durumunda gelmesi gerekir).

Yeni kayıt oluşturmanız için de öncesinde printf ile kullanıcıyı yönlendirip, scanf fonksiyonunu kullanabilirsiniz.

[CODE title="C"]#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *f;
char ch;

f = fopen("test.dat", "r");

if (NULL == f)
{
printf("Dosya bulunamadı. \n");
return 1;
}

printf("Urun\tMiktar\tFiyat \n");

do
{
ch = fgetc(f);
printf("%c", ch);

} while (ch != EOF);

fclose(f);
return 0;
}[/CODE]
 
Windows'da çalışıyor. Diyerlerinde de conio.h'ı atıp çalıştırabilirsin.
[CODE lang="c" title="HIRDAVAT.C"]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <conio.h>

typedef void (*FUNCTION) (void);

typedef struct _hirdavat
{
int kayit_no;
char *arac_ismi;
int miktar;
float fiyat;
}Hirdavat;

typedef struct _cmd
{
char *command;
FUNCTION f;
}Cmd;

#define IGNORE -1
#define MAX_KAYIT 100
#define MAX_COMMAND 6
#define NEWLINE "\n\r"
#define FILE_NAME "hirdavat.dat"

FILE *file;
Hirdavat **h;
int urun_cesiti = 0;

unsigned long get_line_of_file(FILE *file)
{
unsigned long number_of_lines = 1; /* first line = 1 */
long old_pos = ftell(file);
fseek(file, 0L, SEEK_SET);
while(!feof(file))
{
if(getc(file) == 0x0a)
{
number_of_lines++;
}
}
fseek(file, old_pos, SEEK_SET);
return number_of_lines;
}

Hirdavat **degerleri_al()
{
char buff[256], *temp;
unsigned i = 0;
Hirdavat **h;
urun_cesiti = (unsigned)get_line_of_file(file)-1;
if((h = calloc(sizeof(Hirdavat*), MAX_KAYIT)) == NULL)
{
fprintf(stderr, "Yetersiz bellek. Error: %d, %s", errno, strerror(errno));
exit(errno);
}
h[urun_cesiti] = NULL;
for(i = 0; i < urun_cesiti; i++)
{
if((h = calloc(sizeof(Hirdavat), 1)) == NULL)
{
fprintf(stderr, "Yetersiz bellek. Error: %d, %s", errno, strerror(errno));
exit(errno);
}
fgets(buff, 256, file);
h->kayit_no = atoi(strtok(buff, ":"));
temp = strtok(NULL, ":");
if((h->arac_ismi = calloc(sizeof(char), strlen(temp))) == NULL)
{
fprintf(stderr, "Yetersiz bellek. Error: %d, %s", errno, strerror(errno));
exit(errno);
}
strcpy(h->arac_ismi, temp);
h->miktar = atoi(strtok(NULL, ":"));
h->fiyat = atof(strtok(NULL, ":"));
}
return h;
}

/* komutlar: ekle, sil, listele, degistir, cikis, yardim */

void EKLE(void)
{
int i = 0, k;
Hirdavat *u = NULL;
if(urun_cesiti >= MAX_KAYIT-1)
{
printf("Max kayit seviyesine ulastiniz!");
return ;
}
for(i = 0; h != NULL; i++) /* Eski kayitlarin yerini almak icin */
{
if((int)h == IGNORE)
{
if((h = calloc(sizeof(Hirdavat), 1)) == NULL)
{
fprintf(stderr, "Yetersiz bellek! Error: %d, %s", errno, strerror(errno));
exit(1);
}
u = h;
}
}
if(u == NULL) /* yerini alacak kayit yoksa */
{
h[urun_cesiti+1] = NULL;
if((h[urun_cesiti] = calloc(sizeof(Hirdavat), 1)) == NULL)
{
fprintf(stderr, "Yetersiz bellek! Error: %d, %s", errno, strerror(errno));
exit(1);
}
u = h[urun_cesiti];
}
if((u->arac_ismi = calloc(sizeof(char), 64)) == NULL)
{
fprintf(stderr, "Yetersiz bellek! Error: %d, %s", errno, strerror(errno));
exit(1);
}
for(i = 1; i < MAX_KAYIT && u->kayit_no == 0; i++) /* kayit no'su bulmak icin */
{
int flag;
for(k = 0, flag = 0; h[k+1] != NULL; k++)
{
if((int)h[k] == IGNORE) continue;
if(i == h[k]->kayit_no){ flag = 1; break;}
}
if(!flag)
u->kayit_no = i;
}
if(u->kayit_no == 0) u->kayit_no++;
printf("Urun ismini giriniz: ");
fgets(u->arac_ismi, 64, stdin);
u->arac_ismi[strlen(u->arac_ismi)-1] = '\0';
printf("Miktarini giriniz: ");
scanf("%d", &u->miktar);
printf("Fiyatini giriniz: ");
scanf("%f", &u->fiyat);
urun_cesiti++;
printf("Urununuz basari ile eklenmistir."NEWLINE);
}

void SIL(void)
{
int i, no, flag = 0;
printf("Silinecek urunun kayi no'sunu giriniz: ");
scanf("%d", &no);
getchar();
for(i = 0; h != NULL; i++)
{
if((int)h == IGNORE) continue;
if(no == h->kayit_no)
{
flag = 1;
free(h);
(int)h = IGNORE;
urun_cesiti--;
}
}
if(flag == 0)
{
printf("Urun bulunamadi!"NEWLINE);
}
}

void LISTELE(void)
{
int i = 0;
for(i = 0; h != NULL; i++)
{
if((int)h == IGNORE) continue;
printf("Kayit No: %d\tArac ismi: %s\tMiktar: %d\tFiyat: %.2f"NEWLINE,
h->kayit_no, h->arac_ismi, h->miktar, h->fiyat);
if((i % 20 == 0) && (i != 0))
{
printf(NEWLINE"Devam Etmek icin ENTER'e tusa basin"NEWLINE);
getch();
}
}
}

void DEGISTIR(void)
{
int i, flag = 0;
Hirdavat u;
if((u.arac_ismi = calloc(sizeof(char), 64)) == NULL)
{
fprintf(stderr, "Yetersiz bellek! Error: %d, %s", errno, strerror(errno));
exit(1);
}
printf("Degistirilecek urunun kayit no'sunu giriniz: ");
scanf("%d", &u.kayit_no);
getchar();
for(i = 0; h != NULL; i++)
{
if((int)h == IGNORE) continue;
if(u.kayit_no == h->kayit_no)
{
printf("Urunun yeni ismi (eskisi: %s): ", h->arac_ismi);
fgets(u.arac_ismi, 64, stdin);
u.arac_ismi[strlen(u.arac_ismi)-1] = '\0';
printf("Urunun yeni miktari (eskisi: %d): ", h->miktar);
scanf("%d", &u.miktar);
printf("Urunun yeni fiyati (eskisi: %.2f): ", h->fiyat);
scanf("%f", &u.fiyat);
memcpy(h, &u, sizeof(Hirdavat));
printf("Urun basari ile degistirildi."NEWLINE);
flag = 1;
}
}
if(flag == 0)
{
printf("Urun bulunamadi!"NEWLINE);
}
}

void CIKIS(void)
{
int i = 0;
fclose(file);
if((file = fopen(FILE_NAME, "w+b")) == NULL)
{
fprintf(stderr, "Dosya acilamiyor! Error: %d %s", errno, strerror(errno));
exit(0);
}
for(i = 0; h != NULL; i++)
{
if((int)h == IGNORE) continue;
fprintf(file, "%d:%s:%d:%.2f:\n",
h->kayit_no, h->arac_ismi, h->miktar, h->fiyat);
}
fclose(file);
exit(0);
}

void YARDIM(void)
{
printf("Komutlar: ekle, sil, listele, degistir, cikis, yardim"NEWLINE);
}

void main()
{
int i, flag;
char input[256];
Cmd komut[MAX_COMMAND] =
{
{"ekle", EKLE},
{"sil", SIL},
{"listele", LISTELE},
{"degistir", DEGISTIR},
{"cikis", CIKIS},
{"yardim", YARDIM}
};
if(access(FILE_NAME, 0) != 0)
{
if((file = fopen(FILE_NAME, "w+b")) == NULL)
{
fprintf(stderr, "File can't create. Error: %d, %s"NEWLINE, errno, strerror(errno));
exit(errno);
}
}
if((file = fopen(FILE_NAME, "r+b")) == NULL)
{
fprintf(stderr, "File can't open. Error: %d, %s"NEWLINE, errno, strerror(errno));
exit(errno);
}
h = degerleri_al();
YARDIM();
do
{
printf("> ");
scanf("%s", input);
getchar();
for(i = 0, flag = 0; i < MAX_COMMAND; i++)
{
if(!strcmp(input, komut.command))
{
flag = 1;
komut.f();
}
}
if(!flag)
{
printf("Komut bulunamadi!"NEWLINE);
YARDIM();
}
}while(1);
}[/CODE]
 

Yeni konular

Geri
Yukarı