bezpieczne parsowanie wartości z pliku do int

bezpieczne parsowanie wartości z pliku do int
KA
KA
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:Warszawa
  • Postów:1683
0

Hej. Mam w pliku w pierwszej linijce wartość, którą chciałabym bezpiecznie zwrócić jako int (bez żadnych overflow'ow i takich tam). no i mam dwa pytanka:

  1. co zrobi funkcja atoi gdy dostanie wartość w char* dłuższą niż int?
  2. Czy wywołanie fgets bez pętli jeden raz jest okey? (interesuje mnie tylko pierwsza linia)
    Pozdrawiam

PROGRAMY NA ZAMÓWIENIE, ZALICZENIA STUDENCKIE, KONFIGURACJA SERWERÓW, SYSTEMÓW I BAZ DANYCH, STRONY INTERNETOWE, POMOC W PROGRAMOWANIU, POPRAWIENIE I OPTYMALIZACJA APLIKACJI
JAVA, C++, LINUX, WWW, SQL, PYTHON
POSIADAM KOMERCYJNE DOŚWIADCZENIE
TANIO, SZYBKO I PORZĄDNIE
Z KOMENTARZAMI OBJAŚNIAJĄCYMI KOD
PISZ NA PRYWATNĄ WIADOMOŚĆ
CENY JUŻ OD 49,99ZŁ ZA PROGRAM
ZAJMIJ SIĘ TYM CO CIĘ NAPRAWDĘ INTERESUJE!
UR
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 5 lat
  • Postów:17
1

Dzisiaj robiłem to tak:

Kopiuj
int i; //ta która będzie naszym int
string temp; //ta jako czasowa

fstream plik;

plik.open("naszpliczek.txt", ios::in);

//tutaj moglibyśmy dodać sprawdzacz czy plik otwarty to jest:
if ( plik.good() )  //test poprawnosci pliku
{ cout << "\nStreet data opened!"; }
else { cout << "\nOpening street data failure! :("; }


getline(plik, temp, ' '); //w cudzysłowiu znak rozdzielający

istringstream iss(temp);
iss >> i;  // koniec
edytowany 1x, ostatnio: UnicoRush
KA
chciałabym tak zrobić, lecz mam do czynienia z czystym C @^_^@
_13th_Dragon
@UnicoRush, czemu nie od razu plik&gt;&gt;i ?
UR
Myślałem ze tak sie nie da. :(
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:17 dni
3
Kopiuj
int value;
FILE *fd=fopen("plik.txt","r");
if(fd)
  {
   if(fscanf(fd,"%d",&value)==1)
     {
      printf("wczytano %d\n",value);
     }
   else printf("Na poczatku pliku nie liczba\n");
   fclose(fd);
  }
else printf("brak pliku\n");

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
Zobacz pozostałe 4 komentarze
kq
http://en.cppreference.com/w/c/io/fscanf Return value Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned. Faktycznie, czytania minimum na 2 wieczory, na jednym posiedzeniu nie da rady...
_13th_Dragon
@kq tu chodziło raczej o wartość zmiennej value po nieudanym odczycie, czyli przypadek przepełnienia, jest to nieco więcej do przeczytania czyli co najmniej 3 razy więcej niż powiedziałeś :D
KA
tak o to właśnie chodzi. szybciej było mi sprawdzić na przykładzie niż czytać
_13th_Dragon
Masz w takim podejściu dwie pułapki: przypadkowy wynik, UB
KA
spojrzałam teraz i nie mogę tam znaleźć o tym informacji, ale to chyba nie należy do bezpiecznej rodziny sscanf -> jest podatne na buffer overflow. http://stackoverflow.com/questions/1621394/how-to-prevent-scanf-causing-a-buffer-overflow-in-c http://stackoverflow.com/questions/17314796/max-string-length-using-scanf-ansi-c Więc to -1 to tylko po prostu mądre działanie linuxa/glibc na przepełnienie?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.