Hej :)
Mam problem z usprawnieniem mojego programu do pewnego zadania.
Treść jest taka:
Napisz program, który pobierze od użytkownika nazwę pliku, a następnie odczyta i wyświetli na ekranie sumę liczb z pliku. Liczby w pliku oddzielone będą białym znakiem (np. spacja, enter, tabulator).
Jeżeli podany przez użytkownika plik nie istnieje program powinien wyświetlić komunikat Couldn't open file i zakończyć działanie z kodem błędu 4. Jeżeli w plik będą znajdowały się dane inne niż liczby, program powinien wyświetlić komunikat File corrupted i zakończyć działanie z kodem błędbu 6
Jeżeli udało się obliczyć sumę liczb, zawartych w podanym pliku, program powinien ją wyświetlić zwrócić wartość 0.
Przykładowa interakcja z programem (dla pliku wejściowego text.txt):
Podaj sciezke do pliku:⏎
text.txt⏎
Suma wczytanych liczb wynosi: 200
Przykładowa interakcja z programem - brak pliku:
Podaj sciezke do pliku:⏎
diestartyellowsubtractbloc⏎
Couldn't open file⏎
Przykładowa interakcja z programem - uszkodzony plik (zawiera cokolwiek innego, niż liczby):
dawajta sciezke do pliku:⏎
question.txt⏎
File corrupted
Uwaga
W programie nie wolno używać funkcji alokujacych pamięć.
W programie można zadeklarować tylko tablice na 30 znaków (do przechowywania nazw plików). Deklaracja musi wyglądać następująco: nazwa_zmiennej[31];.
W programie nie wolno używać operatora [].
A oto mój kod:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char tab[31]={0};
char input[31]={0};
char *tab_i=&(*(tab+0)), *input_i=&(*(input+0));
int i;
printf("Podaj sciezke do pliku\n");
scanf(" %31[^\n]", input_i);
for(i=0; i<30; i++)
{
*(tab_i+i)=*(input_i+i);
}
FILE *f= fopen(tab_i,"rb");
if(f==NULL)
{
printf("Couldn't open file");
return 4;
}
int suma = 0;
char znak;
int znak_int;
while(fread(&znak,1,1,f) != 0 )
{
if(znak>=48 && znak<=57)
{
}
else if(znak==' ' || znak=='\n' || znak=='\t' || znak=='\0' || znak==13 || znak=='-')
{
}
else
{
//printf("%c",znak);
fclose(f);
printf("File corrupted");
return 6;
}
fscanf(f,"%d",&znak_int);
//printf("\n%d\n",znak_int);
suma+= znak_int;
;
}
printf("%d",suma);
fclose(f);
return 0;
}
Przy sprawdzaniu zadania na testach zauważyłem, że wyskakuję ciągle niepoprawne wartości (sumy liczb z mojego programu różnią się nieznacznie od tego co powinno wychodzić na testach, ale jednak się różni). Zauważyłem między innymi problem w przypadku pojawienia się pustej linijki w moim pliku tekstowym. Wtedy najczęściej dochodzi do dziwnych pomyłek. Np. dla tak zapisanych przeze mnie danych w pliku tekstowym:
2
3
5
3
1 3
policzyło ostateczną wartość jako...18. Tak więc czy jest coś, o czym zapomniałem podczas wykonywania przeze mnie tego zadania? Jeżeli tak, to jak mogę to zaimplementować?