Witam, pisze programik w C, który wczytuje plik tekstowy w którym zapisane są liczby w formie macierzy. Po otwarciu pliku zliczam liczbę kolumn i wierszy w pliku i później alokuję dynamicznie odpowiednią tablicę 1-wymiarową o rozmiarze kolumny*wiersze i wpisuję do niej wczytywane liczby. Założenie jest jeszcze takie, że po każdej wczytanej serii liczb (linii) jest tylko 1 enter.
Problem polega na tym, że niektóre pliki są przetwarzane dobrze, a niektóre źle (jest alokowana albo za duża tablica, albo nie są wczytywane liczby).
Z dołączonych przeze mnie pliku, plik y2.txt jest przetwarzany dobrze, plik liczby.txt, a dla pliku piatka.txt alokowana jest zbyt duża tablica.
http://49939.file4u.pl/download/1791565/liczby_
http://49939.file4u.pl/download/1791566/piatka_
http://49939.file4u.pl/download/1791567/y2_
Wydaje mi się, że problem jest z formatowaniem w pliku, ale nie jestem pewny.
Proszę o pomoc i ewentualną poprawę programu.
Poniżej dołączam kod programu.
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
int main() {
FILE *file; //nazwa pliku
float *num; //tablica liczb wczytanych z pliku
long long int kolumny,wiersze,rozmiar; //liczba kolumn i wierszy w pliku oraz rozmiar tablicy liczb
char znak; //znak wczytywany z pliku txt
kolumny = 0;
wiersze = 0;
//int j;
file = fopen("piatka.txt", "r");
//----------------------------------------------
if(file)
{
printf("Plik otwarto pomyslnie\n");
//zliczanie kolumn w pliku
while (znak !='\n')
{
znak = getc(file);
if (isspace(znak))
{
kolumny++;
}
}
fseek(file,0,SEEK_SET); //powrot do poczatku pliku
//zliczanie wierszy w pliku
while(!feof(file))
{
znak = getc(file);
if(znak == '\n')
{
wiersze++;
}
}
kolumny = kolumny+1;
rozmiar = kolumny*wiersze;
fseek(file,0,SEEK_SET); //powrot do poczatku pliku
num = new float[rozmiar];
//zerowanie tablicy
for(long long int i=0; i<rozmiar; i++)
{num[i]=0;}
//----------------------------------------------
long long int i=0;
while(!feof(file))
{
fscanf(file, "%f", &num[i]); //zapisywanie liczb z pliku do tablicy
i++;
}
printf("Number of numbers read: %d\n\n", i);
printf("The numbers are:\n");
long long int j;
//wypisywanie elementow z tablicy
for(j=0 ; j<i ; j++)
{
printf("%f\n", num[j]);
}
printf("Rozmiar: %d", rozmiar);
fclose(file); //zamkniecie pliku
delete []num; //usuniecie tablicy
getch();
return 0;
}
else
{
printf("Blad otwarcia\n");
fclose(file);
}
}
</i></cpp>