Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cuvinte si expresii neclare

Mod de lucru Purmo Tempco Digital...

Samsung S90C vs LG C3

Problema sunet RCS
 Amortizor sertare bucatarie

Codrea Pallady

Blocurile goale! Orase in car...

Motorul pe benzina 1.0 SCe65
 Mostenire In 1986

Lentile sferica pentru astigmatism

Problema inlocuire usa spate A6 C...

Ce gen de muzica este?
 Drepturile copiilor, in numele &#...

Mocheta peste parchet cu incalzir...

La multi ani mie!

Senzor filtru particule GOLF 7
 

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,058
  • Î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,252
  • Î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,252
  • Î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,252
  • Î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

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

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