Jump to content
theparasite

Ajutor citire random dintr-un fisier

Recommended Posts

Posted

Salutari,

Am si eu nevoie de ajutor, daca se poate, pentru un proiect de sintaxa in C pentru citirea dintr-un fisier dar random. Eu am 32 de numere in fisierul numit citire, vreau sa pun intr-un vector in mod random numerele din fisier. Ma puteti ajuta cu sintaxa full? Adica declarare, citire si inchidere?

Am nevoie in limbaj C, eu in C++ stiu doar citirea, sa folosesc functia RAND nu stiu. Ma puteti ajuta, va rog?

Multumesc.

Posted

rand - C++ Reference

Acolo ai functia de random, cu exemplu.

Ca sa bagi intr-un vector random, folosesti ceva de genul

int val // valoarea in care citesti cate un nr

in v[rand] bagi val, si verifici daca v[rand] este ocupat.Daca e ocupat, mai incerci o data.

p.s. mai bine declari v[32] inafara int main-ului, asa iti va fi mai usor sa vezi daca e ocupat.

  • Downvote 1
Posted

Multumesc pentru raspuns, dar mi se pare complicat. Adica nu stiu de unde sa incep( iertati-mi lipsa de experienta, sunt incepator).

Poti sa ma ajuti cu mai multe detalii?

Adica eu vreau de exemplu sa pun intr-un vector 32 de numere ( citite din fisier) in mod random. Dar nu stiu cum sa fac sa imi citeasca random, iar asta cu ocupat ( sa verific daca e ocupat) este cu vector de pozitie?(daca da, nici asta nu stiu).

Multumesc.

  • Active Members
Posted

Daca ti se pare greu o poti lua pas cu pas:

- citesti fisierul si adaugi numerele intr-un array. (gasesti tone de exemple pe google)

- randomizezi arrayul respectiv ( vezi aici )

- afisezi arrayul final, care va avea elementele intr-o ordine aleatoare.

Incearca sa creezi un program dupa structura data si apoi o sa te ajutam daca ai erori.

Posted (edited)
Salutari,

Am si eu nevoie de ajutor, daca se poate, pentru un proiect de sintaxa in C pentru citirea dintr-un fisier dar random. Eu am 32 de numere in fisierul numit citire, vreau sa pun intr-un vector in mod random numerele din fisier. Ma puteti ajuta cu sintaxa full? Adica declarare, citire si inchidere?

Am nevoie in limbaj C, eu in C++ stiu doar citirea, sa folosesc functia RAND nu stiu. Ma puteti ajuta, va rog?

Multumesc.

Esti la liceu sau la facultate ?

Eu nu inteleg ce vrei sa zici prin "citirea dintr-un fisier dar random".

Vrei sa citesti toate numerele din fisier intr-un vector si dupa sa le aranjezi random in vector ?

Sau doresti sa realizezi citirea propriu-zisa intr-un mod random ?

Fisierul din care citesti datele este un fisier text sau binar ? Poate ar fi mai bine sa pui cerinta (daca o ai).

Edited by tjt
Posted
Esti la liceu sau la facultate ?

Eu nu inteleg ce vrei sa zici prin "citirea dintr-un fisier dar random".

Vrei sa citesti toate numerele din fisier intr-un vector si dupa sa le aranjezi random in vector ?

Sau doresti sa realizezi citirea propriu-zisa intr-un mod random ?

Fisierul din care citesti datele este un fisier text sau binar ? Poate ar fi mai bine sa pui cerinta (daca o ai).

Facultate.

Eu am 32 de numere intr-un fisier. Eu initial m-am gandit sa le pun intr-un vector si apoi sa le amestesc, generandu-mi un vector diferit mereu. Este ca amestecarea unui pachet de carti.

Cerinta este a mea, adica am un proiect de facut, si am nevoie de aceasta parte pe care nu stiu sa o fac. Am vectorul citit din fisier si vreau sa-l amestesc, sau sa citesc din fisier 32 de numere in mod aleatoriu. Cum pot face asta?

Nu ma pricep la diferite functii si imi este dificil sa inteleg solutiile propuse de membrii de mai sus. Am tot cautat solutii, dar nu imi ies.

Posted (edited)

asta este metoda gandita de mine


#include <iostream>
#include<fstream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int vect[32]; //vect este declarat inafara int main-ului.asa vect[0],[1],[2]...[32] va fi egal cu 0.acesst lucru ma ajuta la ***
int main()
{

srand (time(NULL)); // asta e pentru random
int nr; //nr e nr citit din fisier

ifstream f("fisier.txt");
ofstream g("fisieriesire.txt");
while (f>>nr)
{
iar:
int c=rand() %32; //c este randomul din vector, atribui lui C o valoarea random cuprinsa intre 0 si 31.
if(vect[c]==0) vect[c]=nr; //***
else goto iar;
}
f.close();
cout<<endl;
////de aici se afiseaza sirul construti intr-un fisier.
for(int i=0;i<=31;i++)
g<<vect[i]<<" ";
g.close();
return 0;

}

Pe romaneste, ii cer calculatorului sa-mi dea o valoare random cuprinsa intre 0 si 31.Cand mi-a dat una, atribuiesc lui v[valoare random] primul numar din lista data.ca sa verific daca nu cumva este un numar in avel loc in care vreau sa atribui valoarea random, verific prin == 0.La inceput am initializat tot cu 0, si asa pot sti daca e modificat sau nu.

DEZAVANTAJ: daca prin acele numere se afla un zero...o sa ruleze la nesfarsit.Ca sa eviti asta pur si simplu initializezi tot vectorul cu o alta valoare, gen -23451, si modifici if(vect[c]==0) vect[c]=nr; in if(vect[c]==-23451) vect[c]=nr;

Edited by theandruala
Posted
asta este metoda gandita de mine


#include <iostream>
#include<fstream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int vect[32]; //vect este declarat inafara int main-ului.asa vect[0],[1],[2]...[32] va fi egal cu 0.acesst lucru ma ajuta la ***
int main()
{

srand (time(NULL)); // asta e pentru random
int nr; //nr e nr citit din fisier

ifstream f("fisier.txt");
ofstream g("fisieriesire.txt");
while (f>>nr)
{
iar:
int c=rand() %32; //c este randomul din vector, atribui lui C o valoarea random cuprinsa intre 0 si 31.
if(vect[c]==0) vect[c]=nr; //***
else goto iar;
}
f.close();
cout<<endl;
////de aici se afiseaza sirul construti intr-un fisier.
for(int i=0;i<=31;i++)
g<<vect[i]<<" ";
g.close();
return 0;

}

Pe romaneste, ii cer calculatorului sa-mi dea o valoare random cuprinsa intre 0 si 31.Cand mi-a dat una, atribuiesc lui v[valoare random] primul numar din lista data.ca sa verific daca nu cumva este un numar in avel loc in care vreau sa atribui valoarea random, verific prin == 0.La inceput am initializat tot cu 0, si asa pot sti daca e modificat sau nu.

DEZAVANTAJ: daca prin acele numere se afla un zero...o sa ruleze la nesfarsit.Ca sa eviti asta pur si simplu initializezi tot vectorul cu o alta valoare, gen -23451, si modifici if(vect[c]==0) vect[c]=nr; in if(vect[c]==-23451) vect[c]=nr;

Multumesc.

In fisier am asa:

7 7 7 7 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 14


FILE *stream; /*declarare stream (flux de date)*/
stream = fopen("citire.txt", "r"); /*deschidere fisier*/
if(stream == NULL)
{
printf ("Eroare la impartirea cartilor");
}

srand (time(NULL));
int nr; //nr e nr citit din fisier

while (fscanf(stream, "%d", &nr))
{
iar:
int c=rand() %32; //c este randomul din vector
if(pachet[c]==0) pachet[c]=nr; //***
else goto iar;
}
fclose(stream);

In C, si la compilare imi da o eroare :


error: 'iar' undeclared (first use in this function)|
error: label 'iar' used but not defined|

Posted

Daca folosesti si iar: si goto iar; in acelasi subprogram cred ca ar trebui sa mearga...dar cred ca poti folosi si asa, dar e mult mai retardat.Ceva de genul

while(sem==1)

{

sem =1

cod etc

etc

for(int j=0;j<=31;j++)

{if vect[j]==0 sem=0;}

}

Asta ca sa nu mai folosesti goto-ul.In while verifica de fiecare data la sfarsit daca valorile vectorului sunt diferite de 0, daca una nu e diferita, sem devine 0, si while-ul continua.

Posted (edited)

Am modificat asa si a mers, sunt uimit:

int i=0;
FILE *stream; /*declarare stream (flux de date)*/
stream = fopen("citire.txt", "r"); /*deschidere fisier*/
if(stream == NULL)
{
printf ("Eroare la impartirea cartilor");
}

srand (time(NULL));
int nr; //nr e nr citit din fisier

while (!feof(stream))
{ fscanf(stream,"%d", &nr);

int c;
iar:
c=rand() %32; //c este randomul din vector
if(pachet[c]==0) pachet[c]=nr; //***
else goto iar;
}

fclose(stream);
for(i=0;i<=31;i++)
printf("%d ", pachet[i]);

Va multumesc mult pentru ajutor. Multa sanatate si fericire va doresc!

Edited by theparasite
Posted (edited)

Varianta C:

#include <time.h> // time
#include <stdio.h> // sscanf
#include <stdlib.h> // rand
#include <string.h> // strlen

void Extract(int * vec, int size, const char * str)
{
const char * data = str;

int value = 0, offset = 0, pos = 0;

while (sscanf(data, " %d%n ", &value, &offset) == 1)
{
vec[pos] = value; // Save the value
data += offset; // Skip the read value
// Are we in range?
if (++pos >= size)
break; // End of array/vector
}
}

int main(int argc, char **argv)
{
char * buffer = 0; // File contents
long length; // File length
// Open the file
FILE * file = fopen ("file.txt", "r");
// Could the file be opened?
if (file)
{
// Go to the end of the file
fseek(file, 0, SEEK_END);
// Calculate buffer size from beginning to current position
length = ftell(file);
// Go back to the beginning
fseek(file, 0, SEEK_SET);
// Allocated a proper buffer
buffer = (char *)malloc(length);
// Could the buffer be allocated?
if (buffer)
{
// Read the file contents into out buffer
fread (buffer, 1, length, file);
}
// Close the file handle
fclose(file);
}
// Do we have a buffer?
if (!buffer || strlen(buffer) <= 0)
{
puts("No data to process");
return EXIT_FAILURE;
}
#define ELEM_COUNT 32
// Numbers array
int int_vec[ELEM_COUNT] = {0};
// Extract the numbers from the string
Extract(int_vec, ELEM_COUNT, buffer);
// We no longer need the file contents
free(buffer);
// Feed the random generator
srand(time(0));
// Shuffle elements
for (int i = 0, b, r; i < ELEM_COUNT; i++)
{
// Obtain a random element
r = rand() % ELEM_COUNT;
// Backup the current element
b = int_vec[i];
// Swap with the random element
int_vec[i] = int_vec[r];
int_vec[r] = b;
}

// Output array/vector contents
for (unsigned i = 0; i < ELEM_COUNT; i++)
printf(" %d ", int_vec[i]);

return EXIT_SUCCESS;
}

Varianta C++

#include <ctime> // std::time
#include <cstdio> // std::sscanf
#include <vector> // std::vector
#include <string> // std::string
#include <random> //std::mt19937
#include <fstream> // std::ifstream
#include <iostream> // std::cout, std::endl
#include <algorithm> // std::shuffle
#include <streambuf> // std::istreambuf_iterator

void Extract(std::vector< int > & vec, const std::string & str)
{
std::string::const_pointer data = str.c_str();

int value = 0, offset = 0;

while (std::sscanf(data, " %d%n ", &value, &offset) == 1)
{
vec.push_back(value);
data += offset;
}
}

int main(int argc, char **argv)
{
// Open the file
std::ifstream file("file.txt", std::ifstream::in);
// Read file contents to a string
std::string text((std::istreambuf_iterator< char >(file)),
std::istreambuf_iterator< char >());
// Prepare an empty vector
std::vector< int > int_vec;
// Extract the elements from the string
Extract(int_vec, text);
// Create a random number generator
std::mt19937 rg(std::time(nullptr));
// Shuffle the vector elements
std::shuffle(int_vec.begin(), int_vec.end(), rg);
// Output vector contents
for (const auto & n : int_vec)
{
std::cout << n << " ";
}

return EXIT_SUCCESS;
}

ATENTIE: Varianta C++ necesita un compiler cu suport pentru C++11! Ambele versiuni au fost testate pe MinGW-w64 GCC 5.2.0 x32

Edited by S.L.C

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...