0
I am making a program whose function is to import the values of a file . dat and put them inside a vector. For this, I made the following code:
void Import_vec(int tamanho,const char caminho[],float * vetor,int chave)
{
FILE *arquivo = fopen(caminho,"r");
for(int i = 0;i<tamanho;i++)
{
fscanf(arquivo, "%f\t", &vetor[i]);
if(chave == 1)
{
printf("%f\n",vetor[i]); // Caso seja 1, os valores serão impressos no terminal
}
}
fclose(arquivo);
}
In the output appear all the correct values, but when finished printing the last value appears a Trash value (gigantic value that is not in the file).
Output:
0.918033
-0.981341
0.241689
2.344740
-1.605030
-1.395590
-1.280210
1.801470
-0.216157
-1.634040
23.3161324.0574250.878794-6.604258-8.68799711.96468212.795636-5.3303821.332010-8.0112750.7523827.292252-11.467504-0.8759
2310.2975292.430890-13.0802069.1249843.690364-16.438658
Before using fscanf()
I used fgets()
, strtok
and strtod
to read the line, separate the values based on a token and convert the string to a float, but still gave the same problem. What could it be? What causes this? How can I avoid it? Another problem: the size of the vector is 10, but with Trash value the vector ends up having 11 values. How? (To allocate the vector I used malloc(10*sizeof(float))
).
If you need additional information, the complete code is:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
float *Alloc_vec(int n){
float *v = malloc(n*sizeof(float));
if(v == NULL)
{
exit(EXIT_FAILURE);
}
return v;
}
float **Alloc_array(int n, int m){
float **matriz;
matriz = malloc(n*sizeof(float *));
if(matriz == NULL)
{
exit(EXIT_FAILURE);
}
for(int i = 0;i<n;i++){
matriz[i] = malloc(m*sizeof(float ));
if(matriz[i] == NULL){
exit(EXIT_FAILURE);
}
}
return matriz;
}
void Import_vec(int tamanho,const char caminho[],float * vetor,int chave)
{
FILE *arquivo = fopen(caminho,"r");
for(int i = 0;i<tamanho;i++)
{
fscanf(arquivo, "%f\t", &vetor[i]);
if(vetor[i] >10)
{
vetor[i] = 0;
}
sleep(1);
if(chave == 1)
{
printf("%f\n",vetor[i]);
}
}
fclose(arquivo);
}
void Import_array(int n, int m ,const char caminho[],float ** matriz,int chave)
{
FILE *arquivo = fopen(caminho,"r");
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
fscanf(arquivo, "%f ", &matriz[i][j]);
if(chave == 1)
{
printf("%f ",matriz[i][j]);
}
}
}
fclose(arquivo);
}
int main(){
int Ni=20,Nj=30,Nk=10;
float *u = Alloc_vec(Nk);
float *v = Alloc_vec(Nj);
float **A = Alloc_array(Ni,Nk);
float **B = Alloc_array(Nk,Nj);
char caminho_u[] = "u_vec.dat";
char caminho_v[] = "v_vec.dat";
char caminho_A[] = "A_array.dat";
char caminho_B[] = "B_array.dat";
Import_vec(Nk,caminho_u,u,1);
Import_vec(Nj,caminho_v,v,0);
Import_array(Ni,Nk,caminho_A,A,0);
Import_array(Nk,Nj,caminho_B,B,0);
//Definição de C
float **C = Alloc_array(Ni,Nj);
for(int i = 0;i<Ni;i++)
{
for(int j=0;j<Nj;j++)
{
C[i][j] = 0;
for(int k = 0;k<Nk;k++)
{
C[i][j] += A[i][k]*B[k][j];
}
}
}
//Definição de s
float *s = Alloc_vec(Nk);
for(int i = 0;i<Ni;i++)
{
s[i] = 0;
for(int j=0;j<Nk;j++)
{
s[i] += A[i][j]*u[j];
}
}
//Definição de r
float *r = Alloc_vec(Nj);
for(int i = 0;i<Ni;i++)
{
r[i] = 0;
for(int j=0;j<Nj;j++)
{
r[i] += C[i][j]*v[j];
}
float numero = r[i];
printf("%f",numero);
}
float z=0;
for(int i = 0;i<Ni;i++)
{
z+=r[i]*s[i];
}
// printf("%f",z);
for(int i = 0;i<Ni;i++)
{
free(A[i]);
}
free(A);
for(int i = 0;i<Nk;i++)
{
free(B[i]);
}
free(B);
for(int i = 0;i<Ni;i++)
{
free(C[i]);
}
free(C);
free(r);
free(s);
free(u);
free(v);
return 0;
}
The files follow this format: Those of vectors: (u_vec) 0.918033 -0.981341 0.241689 2.34474 -1.60503 -1.39559 -1.28021 1.80147 -0.216157 -1.63404 , and the matrix one is very large, but it is done as expected: rows and columns with their respective elements.
– Lamparejo