Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Amenintat cu moartea de un numar ...

La multi ani @AndReW99!

Alegere masina £15000 uk

TVR vrea sa lanseze o platforma d...
 Strategie investie pe termen lung...

Modulator FM ptr auto alimentat p...

orange cablu f.o. - internet fara...

Robinet care comuta traseul
 A fost lansata Fedora 40

Samsung S24 plus

Imi iau un Dell? (Vostro vs others)

Abonati Qobuz?
 transport -tren

Platforma electronica de eviden&#...

Cot cu talpa montat stramb in per...

Sfat achizitie sistem audio pentr...
 

Citire matrice caractere in C si C++

- - - - -
  • Please log in to reply
7 replies to this topic

#1
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014
fisierul nume contine o lista de nume de genul:
abc xyz
efg hlm
........
kio upz

Ambele imi dau crush...

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char **a[26][30];
int i=1;
FILE *cheie=fopen("nume.txt","r");
while(!feof(cheie)){
	 fgets(*a[i],sizeof(*a[i]),cheie);
	 i++;
}
}


si

int main(void)
{ char lista[27][30];
fstream f("nume.txt");
for(int i=1;f.get(lista[i][30],27,30),++i);
}


De asemenea, cum sta treaba cu alocarea in matrice? Eu credeam ca fiecarui caracter ii corespunde un slot din ea, lui 'b' sau zicem ii corespunde lista[1][2], dar vad ca si daca introduc nume de 20 caractere si am matrice de [5][5] imi afiseaza bine in C.

Edited by VladBtz, 05 December 2016 - 19:22.


#2
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,025
  • Înscris: 24.02.2006
roaga si tu un programator sa-ti scrie codul.

si in caz ca intrebi: nu, tu nu esti programator. un programator nu descrie niciodata o eroare cu "imi dau crush", ci pune un mesaj de eroare primit de la compilator sau la executie.

#3
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014
Am rezolvat pentru C, acum pentru C++

fstream f("nume.txt");
	for(int i=0;f.get(lista[i],30);i++)
	cout<<lista[i];


nu mai da crash, dar imi afiseaza doar primul nume

#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
char **a[26][30]; nu-i matrice de caractere, e matrice de pointeri la siruri de caractere.

In C ar arata cam asa, daca citesti rand cu rand.
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char caractere[26][30];
   int nrRanduri; 

   FILE* fisier = fopen("nume.txt", "r");   
   for (nrRanduri = 0; (! feof(fisier)) && (nrRanduri < (sizeof(caractere) / sizeof(caractere[0]))); ++nrRanduri)
   {
	  fgets(caractere[nrRanduri], sizeof(caractere[nrRanduri]), fisier);
   }
   fclose(fisier);

   for (int i = 0; i < nrRanduri; ++i)
   {
	  printf("Randul %d: %s", i, caractere[i]);
   }
}

Quote

Randul 0: abc xyz
Randul 1: efg hlm
Randul 2: kio upz

In C++, daca vrei sa lucrezi tot cu siruri de dimensiuni hardcodate, arata exact la fel.

Daca vrei insa sa stochezi oricate randuri, fara sa-ti pese cate sunt sau cat sunt de lungi, folosesti ce-ti pune C++ la dispozitie.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

int main(void)
{
   std::vector<std::string> randuri;

   {
	  std::ifstream fisier("nume.txt");

	  std::string rand;
	  while (std::getline(fisier, rand))
	  {
		 randuri.push_back(rand);
	  }
   }

   int nrRand = 0;
   for (std::string& rand : randuri)
   {
	  std::cout << "Randul " << nrRand++ << ": " << rand << "\n";
   }
}


Nu folosesti aiurea stream.get() fiindca nu-i fgets(), nu-i pasa de newline asa ca daca ii ceri 30 de caractere si are de unde, ti le da pe toate, chiar daca ajunge prin mijlocul randului X.

Edited by dani.user, 06 December 2016 - 17:05.


#5
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014
in C, care e rostul raportului dintre cele 2 sizeof ?


ai vreo versiune de C++ fara STL ?

Edited by VladBtz, 06 December 2016 - 17:47.


#6
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Sa extrag 26, sa nu citesc mai multe randuri decat am loc.

#7
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014
for(i=1;!feof(pointer);++i)fgets(caractere[i],30,pointer);


Imi merge si cu asta ( am facut-o dimineata). E ceva gresit la ea ?

#8
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
E cam tot aia, doar ca difera multe practici subtile:
  • Indexezi de la 1, irosesti spatiul de la pozitia 0
  • Hardcodezi 30, trebuie sa-l schimbi in 2 locuri cand vrei sa modifici dimensiunile. Uiti sa modifici in 2 locuri => devine codul exploatabil
  • Nu tii cont de cate randuri poti duce. Citesti mai multe decat permite spatiul alocat => cod exploatabil

Nu degeaba multe proiecte scrise in C sufera sau au suferit in tinerete de gauri de securitate severe.

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate