Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Fgets + stlen() [Problem z liczeniem znaków]
Forum PHP.pl > Forum > PHP
motyl-pl
  1. <?php
  2. final class polowa {
  3. var $wiersz = array();
  4. var $linia = 0;
  5. var $t;
  6.  
  7. function __construct() {
  8. $uchwyt = fopen('tak.txt', 'r');
  9.  
  10. while(!feof($uchwyt)) {
  11. $this->wiersz[$this->linia] = fgets($uchwyt, 1024);
  12. $this->linia++;
  13. }
  14.  
  15. $this->t = $this->wiersz[0];
  16.  
  17. fclose($uchwyt);
  18. }
  19.  
  20. function sprawdzt() {
  21. if($this->t < 1 or $this->t > 100) {
  22. echo "Liczba t jest nie odpowiednia!";
  23. }
  24. }
  25.  
  26.  
  27. function wyswietl() {
  28. for($i=1; $i <= $this->t; $i++) {
  29. $this->sprciag($this->wiersz[$i]);
  30. $caly_wyraz = strlen($this->wiersz[$i]) / 2 ;
  31. $skrocony_wyraz = floor($caly_wyraz);
  32. echo substr($this->wiersz[$i], 0, $skrocony_wyraz)."\n";
  33. }
  34. }
  35.  
  36. function sprciag($wejscie) {
  37. $sprawdz = 2 * strlen($wejscie);
  38. if($sprawdz>1000) {
  39. echo "Ciąg jest za duży";
  40. }
  41. }
  42.  
  43. }
  44.  
  45. $tak = new polowa();
  46. $tak->sprawdzt();
  47. $tak->wyswietl();
  48.  
  49. ?>


tak.txt
Kod
3
pierwszy
lubiec
ktotozrobi


Wejście
W pierwszej linijce wejścia znajduje się jedna liczba całkowita t (1<=t<=100). Każdy wiersz o numerze od 2 do t+1, zawiera ciąg długości 2*k (1<=k<=1000).

Wyjście
Dla każdego przypadku testowego na wyjściu powinien pojawić się ciąg będący pierwszą połową wczytanego ciągu.


Mój problem gdy odczytuje poszczególne wiersze, to strlen jest nie prawidłowe.
Ma ktoś jakiś pomysł ?
kiler129
Nie mam czasu wgłębiać się w kod ale wykonujesz pracę 2x ;]
Do odczytu użyj funkcji file() która zwraca tablicę.
motyl-pl
Zamieniłem na file ale daje ten sam problem, że strlen źle zlicza.
  1. <?php
  2. final class polowa {
  3. var $uchwyt = array();
  4. var $linia = 0;
  5. var $t;
  6.  
  7. function __construct() {
  8. $this->uchwyt = file('tak.txt');
  9.  
  10. echo strlen($this->uchwyt[1]);
  11.  
  12. $this->t = $this->uchwyt[0];
  13. }
  14.  
  15. function sprawdzt() {
  16. if($this->t < 1 or $this->t > 100) {
  17. echo "Liczba t jest nie odpowiednia!";
  18. }
  19. }
  20.  
  21.  
  22. function wyswietl() {
  23. for($i=1; $i <= $this->t; $i++) {
  24.  
  25. $this->sprciag($this->uchwyt[$i]);
  26.  
  27. $caly_wyraz = strlen($this->uchwyt[$i]) / 2 ;
  28. $skrocony_wyraz = floor($caly_wyraz);
  29.  
  30. echo substr($this->uchwyt[$i], 0, $skrocony_wyraz)."\n";
  31. }
  32. }
  33.  
  34. function sprciag($wejscie) {
  35. $sprawdz = 2 * strlen($wejscie);
  36. if($sprawdz>1000) {
  37. echo "Ciąg jest za duży";
  38. }
  39. }
  40.  
  41. }
  42.  
  43. $tak = new polowa();
  44. $tak->sprawdzt();
  45. $tak->wyswietl();
  46.  
  47. ?>


Ktoś ma może inny pomysł ?
kiler129
Nudziło mi się smile.gif
  1. <?php
  2. final class half {
  3. var $date = array(); //Data array
  4. var $rowsToRead;
  5.  
  6. function __construct($file) {
  7. if(empty($file) || !is_readable($file)) { echo "Brak pliku lub jest nieczytelny!"; die(); }
  8. $this->data = file('tak.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); //Read file
  9. var_dump($this->data); //Check data by hand
  10.  
  11. $this->rowsToRead = $this->data[0]; //Number of rows
  12. if($this->rowsToRead < 1 || $this->rowsToRead > 100) {
  13. echo "Liczba t jest nie odpowiednia!";
  14. die();
  15. }
  16. }
  17.  
  18.  
  19. function spilt() {
  20. $res = "";
  21. for($i=1; $i<=$this->rowsToRead; $i++) {
  22. if((2*strlen($this->data[$i]))>1000) {
  23. echo "Ciąg w linii $i jest za duży";
  24. continue;
  25. }
  26.  
  27. $res .= substr($this->data[$i], 0, floor((strlen($this->data[$i]) / 2)))."\n";
  28. }
  29. return $res;
  30. }
  31. }
  32. /**************/
  33. $tak = new half("tak.txt");
  34. var_dump($tak->spilt());
  35. /**************/
  36.  
  37. //Expected results:
  38. /*
  39. array(4) {
  40.   [0]=>
  41.   string(1) "3"
  42.   [1]=>
  43.   string(8) "pierwszy"
  44.   [2]=>
  45.   string(6) "lubiec"
  46.   [3]=>
  47.   string(10) "ktotozrobi"
  48. }
  49. string(15) "pier
  50. lub
  51. ktoto
  52. "
  53. */
  54.  
  55.  
  56. ?>
  57.  
motyl-pl
zajebiście działa dziękuje za napisanie smile.gif)
kiler129
Wpadło mi do głowy - sprawdzaj czy ilość podanych linii do odczytania nie jest większa niż długość pliku bo może wysypać sporo Notice w razie błędnej wartości winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.