Arama butonu
Bu konudaki kullanıcılar: 1 misafir
9
Cevap
944
Tıklama
0
Öne Çıkarma
Verileri listelicek kod
F
14 yıl
Yarbay
Konu Sahibi

visual studio da fstream ile açtığım "List.exe" dosyasının içindeki verileri nasıl bir kod ile listeleyebilirim?
birde bu dosyanın içindeki double türünden olan sayıların ortalamasını nasıl alırım?

teşekkürler





< Bu mesaj bu kişi tarafından değiştirildi form -- 19 Kasım 2010; 18:19:00 >

S
14 yıl
Yarbay

List.EXE derken? bir program mı? eğer program ise açıp verileri tuttuğu memory alanını okuyarak yapabilirsin, başka birşey ise bilgi ver ona göre birşey diyeyim.


Bu mesaja 1 cevap geldi.
F
14 yıl
Yarbay
Konu Sahibi

void FileRead(PersonalInformation* PI) 
{

ifstream f("List.txt");
cout << "\n"<< PI->chFirstName <<" "<< PI->chLastName <<" "<< PI->dNot << "\n";
}


void FileWrite(PersonalInformation* PI)
{
ofstream f("List.txt", ios::app | ios::ate | ios::out);

f << "\n"<< PI->chFirstName <<" "<< PI->chLastName <<" "<< PI->dNot << "\n";
}


Bu şekilde ("List.exe") diye dosya oluşturdum girdiğim isimleri programda iken listeliceğim bir komuta ihtiyacım var


Bu mesaja 1 cevap geldi.
S
14 yıl
Yarbay

Anlatımın yanlış, List.exe senin yazdığın program, list.txt ise senin database in. senin yapmak istediğin şey ise List.txt nin içeriğini listelemek.

Doğru anlamışmıyım?


Bu mesaja 1 cevap geldi.
F
14 yıl
Yarbay
Konu Sahibi

bu konuları daha yeni öğreniyorum yaptığım programı komple vereyim anlatmaktan daha kolay olur :)

 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <stdlib.h>
#include <fstream>
using namespace std;

struct Date
{
int iDay, iMonth, iYear;
};

struct PersonalInformation
{
char chFirstName[10], chLastName[10];
double dNot;
};

void Begin()
{
cout << "********* WELCOME TO STUDENTS PROGRAM *********\n";
cout << "\nKey 'Y' And 'Enter' Continue\n";
cout << "\nKey 'N' AND 'eNTER' Exit\n";
}

void FileRead(PersonalInformation* PI)
{

ifstream f("List.txt");
cout << "\n"<< PI->chFirstName <<" "<< PI->chLastName <<" "<< PI->dNot << "\n";
}


void FileWrite(PersonalInformation* PI)
{
ofstream f("List.txt", ios::app | ios::ate | ios::out);

f << "\n"<< PI->chFirstName <<" "<< PI->chLastName <<" "<< PI->dNot << "\n";
}

int _tmain(int argc, _TCHAR* argv[])
{start:
Begin();
char key;
PersonalInformation PI;
Date Dt;
Dt.iDay = 24;
Dt.iMonth = 11;
Dt.iYear = 2010;
cout <<"\n\nToday = " << Dt.iDay <<"."<< Dt.iMonth <<"."<< Dt.iYear;

cout << "\n\nEnter First Name: \n";
cin >> PI.chFirstName;
cout << "\nEnter Last Name: \n";
cin >> PI.chLastName;
cout << "\nEnter Not: \n";
cin >> PI.dNot;

FileWrite(&PI);
FileRead(&PI);



while(true)
{
scanf("%c",&key);
if(key=='Y'||key=='y')
{system("CLS");
goto start;}
else if( key=='N'||key=='n')
return 0;
}

getch();
return 0;
}


işte bu şekilde girdiğim ismi, soyismi, ve notu List.exe ye kaydediyorum (bu database mi oluyo?). kaydettiğim isimleri program içinde listelemem lazım.

şöle bir şey mümkün mü? if döngüsü ile örneğin

if (key=='S')
show ("List.exe") gibi


Bu mesaja 1 cevap geldi.
E
14 yıl
Çavuş

burda yaptığın en büyük yanlış şu; programın mantıklı bir algoritması yok.

önce bir kağıdı alıp akış diyagramı yapman gerekir.

program çalıştı, biz ne tür seçenekleri kullanıcı önüne koyucaz? ya kayıt ekleme yada kayıtları listeleme gibi, dolayısıyla bizim en başa 3 seçenek koymamız gerek

1-Yeni Kayıt Ekle
2-Kayıtları Listele
3-Çıkış


gibi, tabi burada şu var adamın kaç tane kayıt eklemek istediğni biliyor muyuz? yada kaç kez kayıtları listeletmek isteyeceğini? hayır bilmiyoruz, ama ne zaman çıkmak istediğini biliyoruz, menü ekranında 3 e basınca

yani biz bir sonsuz döngü yapalım burdan çıkmanın yoluda, menüde, 3 tuşuna basmak olsun.


 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <stdlib.h>
#include <fstream>
using namespace std;
void listele()
{
ifstream dosya("liste.txt");

if( dosya.is_open() )
{
while( !dosya.eof() )
{
string line;

getline( dosya, line );
size_t t = line.find_last_of(' ');//satırdaki en son boşluğu bulalım, not dan önce geliyordu değil mi?

string adsoyad = line.substr(0, t);//başlangıçtan son boşluğa kadar
string snot = line.substr(t+1);//+1 boşluğu atlamak için

float not = atof(snot.c_str());

cout << adsoyad << " " << not << endl << endl;
}
}
}

void yenikayit()
{
}

int _tmain(int argc, _TCHAR* argv[])
{
while(true)//bu sonsuz döngü
{
cout << "1-Yeni Kayıt Ekle" << endl;
cout << "2-Kayıtları Listele" << endl;
cout << "3-Çıkış" << endl;

char secim;
cin >> secim; //alalım seçimi

if( secim == '1' )
yenikayit();
else if( secim == '2' )
listele();
else if( secim == '3' )
break;//yahut return 0;
}
return 0;
}



yalnız yukarda atof kısmına dikkat et, yaptığın program varsayılan olarak ingilizcedir, 75.800 sayısını ingilizcede, 75 tam binde 800 şeklinde okursun, bu sayı türkçede 75 bin 800 demek, yani notu girerken, küsüratından önce nokta at, virgül değil

anlamadığın yer olursa sor.

artık gerisini kendin yaparsın zaten.


Bu mesaja 1 cevap geldi.
F
14 yıl
Yarbay
Konu Sahibi

@eserb
teşekkürler hocam baya faydalı oldu listeleme kodunu kullandım, menü yapmak istemiyorum görünüş basit ama kodlar iyi olmalı
yinede seçim sunuyorum (devam et, listele ve çık). son hali şu şekilde

 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
#include <stdlib.h>
#include <fstream>
#include <iomanip>
using namespace std;

struct Date
{
int iDay, iMonth, iYear;
};

struct PersonalInformation
{
string sFirstName, sLastName;
float fNot;
};

void Begin()
{
cout << "********* WELCOME TO STUDENTS PROGRAM *********\n";
}

void FileRead(PersonalInformation* PI)
{

ifstream file("List.txt");
cout << "\n"<< PI->sFirstName <<" "<< PI->sLastName <<" "<< PI->fNot << "\n";
}


void FileWrite(PersonalInformation* PI)
{
ofstream file("List.txt", ios::app |ios::out | ios::ate);

file<<"\n"<< PI->sFirstName <<" "<< PI->sLastName <<" "<< PI->fNot;
}

void show()
{
ifstream file("List.txt");

if (file.is_open())
{
while (!file.eof())
{
string line;

getline (file, line);
size_t t = line.find_last_of(' '); // en son boşluğu bul not'tan önceki

string Name = line.substr(0, t); // başlangıçtan ilk boşluğa kadar olan kısım
string sNot = line.substr(t+1);
float fnot = atof(sNot.c_str());
cout << Name <<" "<< fnot <<"\n";
}
}

}


int _tmain(int argc, _TCHAR* argv[])
{start:
Begin();
char key;
PersonalInformation PI;
Date Dt;
Dt.iDay = 24;
Dt.iMonth = 11;
Dt.iYear = 2010;
cout <<"\n\nToday = " << Dt.iDay <<"."<< Dt.iMonth <<"."<< Dt.iYear;


cout << "\n\nEnter First Name: \n";
cin >> PI.sFirstName;
cout << "\nEnter Last Name: \n";
cin >> PI.sLastName;
cout << "\nEnter Not: \n";
cin >> PI.fNot;

FileWrite(&PI);
FileRead(&PI);

cout <<"\nPres '2' to Show List\n";
cout <<"Pres 'Y' to Continue\n";
cout <<"Pres 'N' to Exit\n";

while(true)
{
scanf("%c",&key);
if(key=='Y'||key=='y')
{system("CLS");
goto start;}
else if (key=='2')
{show();}
else if(key=='N'||key=='n')
return 0;
}

getch();
return 0;
}


şimdi buna yapmam gereken girilen tüm notların ortalamasını almak :)


Bu mesaja 1 cevap geldi.
E
14 yıl
Çavuş

while (!file.eof())

kısmının 1 satır üstüne

float toplam = 0;
float ogrencisayisi = 0;

yaz

float fnot = atof(sNot.c_str());

kısmının alt satırına

ogrencisayisi++;
toplam += fnot;

yazarsan zaten her ögrencinin notunu birbiriyle toplamış ve kaç öğrenci olduğuna öğrenmiş olursun

while (!file.eof())

dönsünün çıkışına

cout << "not ortalaması: " << (toplam / ogrencisayisi );

yazarsan, ortalamayı ekranda görürsün.

yalnız çok çalışman lazım! Eğer abim gibi üniversitede makina mühendisliğinde programlama dersi görüp sonrada gidip yağdan-pastan, kopan halatlardan, devrilen vinçlerden başka birşeyle boğuşmayacaksan tabi...


Bu mesaja 1 cevap geldi.
F
14 yıl
Yarbay
Konu Sahibi

hocam büyüksün üniversite ikinici sınıf öğrencisiyim ama inan hiçbir şey öğrettikleri yok internet sayesinde bende kendimi geliştirmeye çalışıyorum elimizden geldiğince Allah büyük. çok teşekkür ederim sana


Bu mesaja 1 cevap geldi.
G
14 yıl
Yarbay

Arkadaşım eğer zamanın varsa ve bu işte istekliysen programla uğraşmayı bırak, otur kendine sağlam bir temel at önce. Senin seviyene göre 10-15 gün sıkı bir çalışma yeterli olur.

Eğer vakit yoksa bence "kopya çek". Yani bir şekilde hazır kod kullan, illaki ben yapacam deme. Çünkü yazdığın kod ezbere yazılmış gibi. eserb arkadaşın dediği gibi, mantıklı bir algoritma değil bu.

Daha exe, file, object, memory kavramları bile kafanda tam oturmamış. Bak ben sana bazı şeylerden bahsedeyim.

Yazdığın kod kendi başına çalışamaz, cpu nun anlayıp çalıştırabileceği bir formata dönüştürülmesi gerekir. Derleyici yazdığın program kodunu okuyup bir ikili (binary) dosya üretir. Bu dosyanın uzantısı windows larda exe'dir. İçerisinde senin programının haricinde işletim sistemi ile ilgili sistem çağrıları, startup kodu vs. bulunur.

Programında kullandığın bütün değişkenler, diziler, nesneler bellekte (ram, cpu önbelleği, sanal bellek vs. bizi ilgilendirmez) saklanır. Veriler program (exe) çalışırken işlemci ve bellek arasında dolaşıp dururlar ama program sonlanınca uçup giderler.

Program sonlansa da pc kapatılsa da kaybolmasını istemediğin veriler varsa bunları uygun biryere kaydetmelisin (genellikle harddisk e). Bunun için programına dosya işlemleri yapacak kodlar eklemelisin.

Şimdi dönelim senin programına. Daha önce öğrenci bilgilerinin saklanmasına gerek olmadığını söylemiştin. Ama halen dosya fonksiyonları kullanıyorsun. Önce bilgileri alıp dosyaya yazıp sonra da aynı bilgiyi tekrar okumanın hiçbir mantığı yok. Zaten dosyada kayıtlı verin olduğu zaman bunları okuyup hafızaya atacak bir "load" fonksiyonun olmalı. Ama senin kodda daha önceki kayıtlara hiçbir erişim metodu yok. Neyse kısaca fstream e falan ihtiyacın yok.

Yapman gereken şey girilecek en fazla öğrenci bilgisi için uygun yer açmak ve orayı kullanmak. Tahminen en fazla 50 giriş yapılabilir.
struct Personel {
string adi_soyadi; // adı ve soyadını ayrı da yazabilirsin tabi.
float not;
};
Personel ogrenci[50];
int id;

Buyur sana 50 öğrencinin bilgisini saklayacak hafıza alanı. id değişkeni sıradaki öğrenci numarasını tutacak. Öğrenci kaydı (belleğe) şöyle yapılabilir.
getline(cin, ogrenci[id].adi_soyadi);
cin >> ogrenci[id].not;
++id;

İsim ve notları yazdırmak için şöyle bir döngü yeter.
int n = 0;
for(; n < id; n++)
cout << ogrenci[n].adi_soyadi << ogrenci[n].not;

Şu kod not ortalamasını verir.
int n = 0;
float ortalama, toplam = 0.0;
for(; n < id; n++)
toplam += ogrenci[n].not;

ortalama = toplam / id - 1;

Şu da en büyük notu verir.
int n = 0;
float enbuyuk = ogrenci[0].not;
for(; n < id; n++) {
if(ogrenci[n].not > enbuyuk) enbuyuk = ogrenci[n].not;
}


İnşallah yardımcı olur. Sıfırdan bir algoritma çıkarmalısın. Aslında kodundaki hataları söylemedim; Açılmış olan dosyayı arka arkaya tekrar açmak, aynı isimde hem giriş hem çıkış dosyasını ayrı ayrı açmak, açılan dosyayı kapatmamak, gereksiz yere goto ile dallanmak gibi. Mesela programdan çıkış şöyle birşey olmalı:

char key;

do {
cin.get(key);
...
...
} while(key != 'c');
return 0;
// end of main()

c ye basılırsa döngüden çıkılır, aksi halde devam edilir.





< Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 21 Kasım 2010; 2:00:18 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.