• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Skrypt sumujący liczby całkowite z pliku

Object Storage Arubacloud
+1 głos
471 wizyt
pytanie zadane 13 kwietnia 2022 w PHP przez MKolaj15 Bywalec (2,270 p.)
zamknięte 25 kwietnia 2022 przez MKolaj15

Witam, mam do napisania skrypt, który będzie dodawał do siebie (lub odejmował jeśli przed liczbą znajduje się "-") liczby całkowite zapisane w pliku /tmp/data.txt, oddzielone spacją. Ogólnie z dodawaniem nie mam problemu, ale jeżeli chodzi o liczby ujemne, to nie wiem jak przejść do następnego znaku i go odjąć, kiedy program znajdzie już znak "-". Oto mój kod:

<?php
        if (!$fd = fopen('/tmp/data.txt', 'r')){
            echo "Nie można otworzyć pliku data.txt";
        }
        else{
            while (($str = fgetc($fd)) !== false){
                if (is_numeric($str)){ 
                    $a += $str;
                } else if($str == "-"){
                     $a -= $str; // wiadomo, że nie zadziała  
                }
            }
            fclose($fd);
        }
        echo $a;
?>

Liczę na pomoc i z góry dziękuję!

komentarz zamknięcia: uzyskałem odpowiedź

1 odpowiedź

+2 głosów
odpowiedź 13 kwietnia 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)
Możesz do tego użyć chociażby substr() wskazując, że ma zacząć od 1 znaku (czyli pominie -) albo ltrim() ze wskazaniem, aby usunął znak minusa.

Jednak jeśli w tej zmiennej będziesz miał tylko liczbę np. -5, to odejmowanie powinno zadziałać już bez tego elseif, po prostu na dodawaniu :) To już wynika z samej matematyki: 10 - 5 da 5, ale 10 + -5 także da 5. W związku z tym jeśli Twoje $a to będzie np. 10 i zrobisz $a += -5 to efekt będzie ten sam jak dla $a -= 5. Nawet jeśli z pliku zostanie to odczytane jako string, to przy próbie odejmowania PHP pewnie spróbuje rzutować sobie to na liczbę.
komentarz 13 kwietnia 2022 przez MKolaj15 Bywalec (2,270 p.)
Dzięki za pomoc, tylko chodziło mi też to jak wewnątrz tego elseif'a usunąć znak "-" przed kolejnym wczytanym znakiem. To znaczy, kiedy fgetc napotka już "-", to jak odwołać się do następnego znaku, żeby usunął przed nim ten minus i został dodany (czy też odjęty) do $a (z tego co wiem fgetc wczytuje po jednym znaku z pliku)?
1
komentarz 13 kwietnia 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)
Ach tak, skupiłem się tylko na tym jak się pozbyć minusa i nie zwróciłem uwagi, że odczytujesz po znaku. To może powodować jednak więcej problemów, co gdy liczba w pliku będzie dwucyfrowa? W taki sposób też zostanie źle dodana/odjęta.

Wspomniałeś, że liczby są oddzielone spacją, a więc może trzeba zmienić sposób odczytu z pliku i zamiast tego np. odczytać go w całości na raz przez file_get_contents(), a następnie przy użyciu explode() podzielić odczytaną zawartość na elementy. Wtedy dostaniesz tablicę elementów po której można iterować i wykonywać operacje.
1
komentarz 13 kwietnia 2022 przez MKolaj15 Bywalec (2,270 p.)

Dzięki, tak właśnie zrobiłem i działa. Podsyłam kod, gdyby ktoś był ciekawy.

<?php
    if (!$fd = fopen('/tmp/data.txt', 'r')){
        echo "Nie można otworzyć pliku test.txt";
    }
    else{
        $a = explode(" ", file_get_contents("/tmp/data.txt"));
        foreach($a as $i) {
             $b += $i;   
        }
    }
    echo $b;
?>

 

1
komentarz 14 kwietnia 2022 przez VBService Ekspert (253,340 p.)
edycja 14 kwietnia 2022 przez VBService

@MKolaj15; BTW, Twój kod w razie jak if spełni warunek

if (!$fd = fopen('/tmp/data.txt', 'r'))

i pojawi się komunikat

echo "Nie można otworzyć pliku test.txt";

to ten kod się nie wykona

    else {
        $a = explode(" ", file_get_contents("/tmp/data.txt"));
        foreach($a as $i) {
             $b += $i;   
        }
    }

i wtedy php "rzuci" warning-a lub error (zależne od konfiguracji), że zmienna $b "nie została zainicjowana".

    echo $b;

 

 

propozycja + użycie array_reduce()

<?php
  if (! $fd = fopen('/tmp/data.txt', 'r'))
    echo 'Nie można otworzyć pliku data.txt';
  else {
    $a = file_get_contents("/tmp/data.txt");
    echo array_reduce(explode(" ", $a), function($a, $b) { return $a + $b; });
  }
?>

lub

  if (! $fd = fopen('/tmp/data.txt', 'r'))
    echo 'Nie można otworzyć pliku data.txt';
  else
    echo array_reduce(
    					explode(" ", file_get_contents("/tmp/data.txt")),
                        function($a, $b) { return $a + $b; }
                     );
?>

 

Podobne pytania

0 głosów
1 odpowiedź 579 wizyt
+1 głos
1 odpowiedź 185 wizyt
pytanie zadane 9 lutego 2022 w JavaScript przez gatka84 Bywalec (2,150 p.)
0 głosów
0 odpowiedzi 314 wizyt

92,578 zapytań

141,426 odpowiedzi

319,653 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...