dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

C++ texta failu parseeshana
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
gazz



Joined: 03 Jan 2004
Posts: 355
Location: Teika

PostPosted: Wed Feb 23, 2005 6:54 pm    Post subject: C++ texta failu parseeshana

netiishaam uzduuros probleemai - kaa lai elementaari noparsee texta failus. Man teksta failaa katra rinda piem sastaav no id(10 simbolus garsh), name(30 simbolu garsh), address(50 simbolu garsh). Tad nu ir jautaajums kaa juus sho teksta failu pa vienai rindinjai parseetu? Nez kapeec man tas likaas triviaali liidz briidim kad tas bija jaauztaisa... Iespeejams esmu akls un neredzu risinaajumu degungalaa, tad luudzu noraadiet uz to!
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Feb 23, 2005 7:06 pm    Post subject:

definee "parseet" shajaa gadiijumaa Smile Tu gribi nolasiit uz izmainiit datus tajaa failaa, taa lai paareejais nenojuuk, vai kaa?
_________________
Back to top
View user's profile Send e-mail
gazz



Joined: 03 Jan 2004
Posts: 355
Location: Teika

PostPosted: Wed Feb 23, 2005 7:09 pm    Post subject:

precizeeshu - ielasiit ieksh
Code:
struct Person{
int id;
char name[30];
char address[50];
};


peec iespeejas vienkaarshaak izveidot array ar visaam rindinjaam-personaam.
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Feb 23, 2005 7:16 pm    Post subject:

Hmm, es pagaidaam nesaskatu probleemu.. laikam par maz zinu par uzdevumu Smile Tad - nav zinaams ierakstu skaits? Katrs no tiem id, name un address stringiem, kad ierakstiiti failaa, ir NULL'termineets, vai fixeeta garuma?
_________________
Back to top
View user's profile Send e-mail
gazz



Joined: 03 Jan 2004
Posts: 355
Location: Teika

PostPosted: Wed Feb 23, 2005 7:27 pm    Post subject:

Nu mans variants vareetu izskatiities shaadi
Code:

struct Person {
   int id;
   char name[31];
   char address[51];
}

ifstream inFile("fails.txt");

vector<Person> vPersons;

while (!inFile.eof()) {
   Person tmpPerson;
   char tmpBuf[90];
   inFile.getline(tmpBuf,90);
   tmpPerson.id = atoi(tmpBuf); // mums id ir pirmais rindinjaa
   memcpy(tmpPerson.name, (tmpBuf+10), 30);
   tmpPerson.name[30] = '\0';
   memcpy(tmpPerson.address, (tmpBuf+40), 50);
   tmpPerson.address[50] = '\0';
   vPersons.push_back(tmpPerson);
}

inFile.close();

Jautaajums ir - vai nav iespeejams to pashu izdariit kaut kaadaa normaalaakaa veidaa, piemeeram ir ifstream operatoru >> vai kaut ko tml?
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Feb 23, 2005 7:33 pm    Post subject:

Hmm, nu neko labaaku neieteikshu itseviskji ar streamiem, jo pasham labaak patiik C stilaa lasiit failus. Vieniigais, kur vareetu buut probleemas - vai id vienmeer ietilps int mainiigajaa? 10 cipari var buut arii aarpus int robezjaam.. bet nu izskataas, ka tas, kas raksta failaa, arii izmanto int un tur probleemaam nevajadzeetu buut?
_________________
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Feb 23, 2005 7:35 pm    Post subject:

ja nu vieniigi, tempbuf'aa lasiit tikai id un tad atoi()'ot vinju, bet vaardu un adresi uzreiz lasiit tmpPersonaa...
_________________
Back to top
View user's profile Send e-mail
chaosman



Joined: 28 Oct 2003
Posts: 64
Location: Rīga

PostPosted: Wed Feb 23, 2005 7:39 pm    Post subject:

Elementaars fscanf() derees. Vai arii ja negribi lietot "C stilu", tad taakaa tagad un tad no tmpBuf lasa ar sscanf().
Back to top
View user's profile
gazz



Joined: 03 Jan 2004
Posts: 355
Location: Teika

PostPosted: Wed Feb 23, 2005 7:41 pm    Post subject:

man ar bija taada doma, bet fscanf/sscanf nevar pateikt cik garu stringu lai vinsh lasa, shis nolasa tikai liidz pirmajam white space'am. Bet ja name piem ir "Antons De Sazinkas" ?
Back to top
View user's profile Send e-mail
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: Wed Feb 23, 2005 7:46 pm    Post subject:

Nu var jau arii failu atveert ar FILE* fp=fopen("fails.txt","rb"); un lasiit ar fread() - lasi cik garu stringu vajag Smile
_________________
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sun Feb 19, 2006 12:12 pm    Post subject:

Es ieteiktu katru ierakstu atdaliit ar tab('\t').Tad ierakstiem nebuutu fikseets garums.
Tabulas piemers:
12\tJanis Jaankjalns\tSkrunda\n
13\tZhanis Zhanjkalns\tLiepaaja\n

Atvert failu ar fopen("fails","rb") (vai kauko citu).
Un tad ar fread (vai kauko citu) lasiit kameer sasniedzam tab(\t) vai jaunu rindinju(\n).
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Sun Feb 19, 2006 2:07 pm    Post subject:

Manuprāt to var izdarīt šādi:
Code:
  ifstream inFile("fails.txt");
  vector<Person> vPersons;
  string line;

  while (getline(inFile, line))
  {
    Person tmpPerson;
    stringstream ss;
    ss << line;

    ss.width(10);
    ss >> tmpPerson.id;
    ss.seekg(10);
    ss.read(tmpPerson.name, 30);
    ss.read(tmpPerson.address, 50);
    tmpPerson.name[30] = 0;
    tmpPerson.address[50] = 0;
    vPersons.push_back(tmpPerson);
  }

  inFile.close();

Vēl vienkāršāks kods paliks, ja tu tiešām kā elvman saka atdalīsi tās daļas ar atstarpi (vai tabu). Tikai to gan tu vari tādā gadījumā, ja tev paši dati nesatur šo whitespeisu (atstarpes vai tabus):
Code:
  while (getline(inFile, line))
  {
    Person tmpPerson;
    stringstream ss;
    ss << line;

    ss.width(10);
    ss >> tmpPerson.id;
    ss.width(30);
    ss >> tmpPerson.name;
    ss.width(50);
    ss >> tmpPerson.address;
    vPersons.push_back(tmpPerson);
  }

  inFile.close();
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sun Feb 19, 2006 2:11 pm    Post subject:

Nu ja izmanto tab,tad whitespace'us dati var satureet (nedomaaju ka dati,pimeram,vard un uzvards vai adrese varetu saturet tabus).
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Sun Feb 19, 2006 2:21 pm    Post subject:

Manā kodā nevar. Streama >> operators extracto datus līdz pirmajam whitespeisam, kas ir vai nu tabs, vai atstarpe, vai enters.
Back to top
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sun Feb 19, 2006 2:29 pm    Post subject:

Aha.Nekad ar stream neesmu darbojies.Vajadzeetu pameegjinaat.Bet nu vispaar man labaak patiik pa baitam lasiit (ar fread),tad arii var kontroleet cik taalu lasiit un kur apstaaties.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group