Wątek przeniesiony 2018-10-29 19:16 z PHP przez Patryk27.

Jak zapisać i wczytać liczby z pliku tekstowego?

0

witam, miałem do napisania skrypt w którym z formularzy wczytuje 2 liczby, następnie wpisuje je do pliku a po tym obliczam średnią tych liczb (koniecznie muszą być wczytane z pliku) i nie wiem co jest nie tak, pętla wykonuje się na tyle razy że nie ładuje się nic.

Wpisywanie danych do pliku.( działa)

$liczba1 = $_POST['liczba1'];
$liczba2 = $_POST['liczba2'];
$plik = fopen("plik.txt","w");
$a=0;
fputs($plik,$liczba1."\n");
fputs($plik,$liczba2);
fclose($plik);

Wczytywanie liczb z pliku (nie działa)

while(!feof($plik))
{
	$a=$a+(intval(fgets($plik,1024)));
}

echo $a/2;
0

Próbujesz robić za dużo naraz - podziel cały problem na dwa etapy / pod-problemy:

  1. Wczytanie liczb z formularza i zapisanie ich do pliku.
  2. Wczytanie liczb z pliku i policzenie ich średniej.

Usuń cały Twój kod i podeślij taki fragment, który realizuje (póki co) tylko pierwszy punkt.

Btw, przyjrzyj się nazwom Twoich zmiennych w obecnym kodzie.

0
Patryk27 napisał(a):

Próbujesz robić za dużo naraz - podziel cały problem na dwa etapy / pod-problemy:

  1. Wczytanie liczb z formularza i zapisanie ich do pliku.
  2. Wczytanie liczb z pliku i policzenie ich średniej.

Usuń cały Twój kod i podeślij taki fragment, który realizuje (póki co) tylko pierwszy punkt.

Btw, przyjrzyj się nazwom Twoich zmiennych w obecnym kodzie.

Poprawione

0

Nie modyfikuj postów - niszczy to chronologię wydarzeń.

Ok, no to teraz wrzuć kod wczytujący liczby z pliku i liczący ich średnią :-)

0

Cały kod

<?php

$liczba1 = $_POST['liczba1'];
$liczba2 = $_POST['liczba2'];
$plik = fopen("plik.txt","w");
$a=0;
fputs($plik,$liczba1."\n");
fputs($plik,$liczba2);
while(!feof($plik))
{
	$a=$a+(intval(fgets($plik,1024)));

}


echo $a/2; 


?>
0

Przeczytaj jeszcze raz polecenie, dokładnie:

wrzuć kod wczytujący liczby z pliku i liczący ich średnią

Gdzie masz tutaj napisane wrzuć kod zapisujący liczby do pliku?

0

Kod wczytujący liczby z pliku i liczący ich średnią

$a = 0;
while(!feof($plik))
{
	$a=$a+(intval(fgets($plik,1024)));

}


echo $a/2; 


0

Nieprawda - ten kod nie może wczytywać liczb z pliku, skoro nigdzie nie ma fopen().

Tak jak powiedziałem, próbujesz robić za dużo rzeczy naraz - zapomnij w ogóle o Twoim początkowym kodzie i skup się na pod-problemach tak, jak gdyby miały być osobnymi programami.

Wrzuć kod, który od A do Z będzie wczytywał liczby z pliku i liczył ich średnią. Tyle i tylko tyle.

0
<?php
$a = 0;
$plik = fopen("plik.txt","w");
while(!feof($plik))
{
	$a=$a+(intval(fgets($plik,1024)));

}

fclose($plik);
echo $a/2; 

?>
0

Nieprawda:

  1. Otwierasz plik w trybie tylko do zapisu ;-)
  2. Dlaczego $a / 2? Skąd wiesz, że będą tylko dwie liczby? (pamiętaj: skupiamy się na pod-problemie, bez zwracania uwagi na resztę)
0

Już zmieniony tryb

<?php
$a = 0;
$plik = fopen("plik.txt","w+");
while(!feof($plik))
{
    $a=$a+(intval(fgets($plik,1024)));

}

fclose($plik);
echo $a/2; 

?>

W zadaniu narzucone są tylko dwie liczby bo są 2 formularze w których wpisujemy jedna liczbę.

0

W tym pod-problemie mam tylko wczytać liczby, prawda?
Dlaczego więc wybrałeś tryb w+?

Spójrzmy do dokumentacji:
http://php.net/manual/pl/function.fopen.php

Który z trybów jest opisany tylko do odczytu?

W zadaniu narzucone są tylko dwie liczby bo są 2 formularze w których wpisujemy jedna liczbę.

Ok, nic się jednak nie stanie, jeśli od razu podejdziemy do tego lepiej / ogólniej ;-)

0

Masz rację, w takim razie:

<?php
$a = 0;
$plik = fopen("plik.txt","r");
while(!feof($plik))
{
    $a=$a+(intval(fgets($plik,1024)));
 
}
 
fclose($plik);
echo $a/2; 
 
?>
0

O, great!

Sprawdziłeś ten program na przykładowych danych (na ręcznie utworzonym plik.txt)?

0

Tak, lecz wynik to 0 więc dalej coś jest nie tak.
//edit jednak działa, mój błąd w pisaniu kodu.

0

Ok, no to wracamy do pierwszego pod-problemu: czy Twój kod zapisujący liczby z formularza do pliku zapisuje je prawidłowo?

0

nie do końca prawidłowo, nie działa znak specjalny \n nie wiem z jakiego powodu, liczby zapisują się w jednym ciągu znaków

0

Działasz na Windowsie, Linuksie czy Maczku?

0

Windows

0

Ano - w przypadku Windowsa znak nowej linii to \r\n, a nie samo \n.
Tzn. większość edytorów i tak poprawnie zinterpretuje samo \n, ale np. taki Notatnik się gubi.

Najbezpieczniej jest korzystać z PHP_EOL (end of line) - jest to stała zawierająca znak nowej linii zgodny z tym systemem, na którym odpalany jest PHP.

Czyli w takiej formie powinno śmigać:

fputs($plik, $liczba1 . PHP_EOL);
0

ok, poprawiłem wszystko co należy i pierwsza część kodu działa jak należy

<?php

$liczba1 = $_POST['liczba1'];
$liczba2 = $_POST['liczba2'];
$plik = fopen("plik.txt","w");
$a=0;
fputs($plik,$liczba1.PHP_EOL);
fputs($plik,$liczba2.PHP_EOL);
fclose($plik);

?>
1

Najs!

W takim wypadku możemy teraz obydwie części zespolić, dopisując parę komentarzy dla dodania czytelności:

<?php

// Wczytanie liczb z formularza
$liczba1 = $_POST['liczba1'];
$liczba2 = $_POST['liczba2'];

// Zapisanie liczb do pliku
$plik = fopen("plik.txt","w");
fputs($plik,$liczba1.PHP_EOL);
fputs($plik,$liczba2.PHP_EOL);
fclose($plik);

// Obliczanie średniej na podstawie liczb z pliku
$srednia = 0;

$plik = fopen("plik.txt","r");
while (!feof($plik)) {
    $srednia = $srednia + (intval(fgets($plik,1024)));
}
fclose($plik);

echo $srednia / 2; 

W takiej formie powinno śmigać :-)

0

tak też zrobiłem, dzięki za pomoc ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1