Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

getline() czyta cały plik zamiast jednej linii


  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 rEaLaPpLeFaN

rEaLaPpLeFaN
  • 708 postów

Napisano 16 maja 2013 - 15:33

Od pewnego czasu uczę się programowania w C++ i innych językach. Całkiem niedawno przesiadłem się na Maca więc automatycznie sięgnąłem po Xcode. Dzisiaj używając getline() zauważyłem że pokazywana jest cała zawartość pliku zamiast jednej linii. Pod Visual Studio działa normalnie. Mój błąd czy to normalne zachowanie Xcode?

#include 
#include 
#include 
using namespace std;

int main () {
    string myStr;
    fstream* myfile = new fstream("file.txt");

    if (myfile->is_open())
    {
     getline (*myfile,myStr);
     cout << myStr;
    }

   else cout << "Unable to open file";

   return 0;
}



#2 ja_sam

ja_sam
  • 117 postów
  • SkądToruń/Bobolin

Napisano 16 maja 2013 - 15:55

kod wygląda dobrze. VS C++ i XCode mają ten sam silnik więc na Mac-u również powinno działać poprawnie. Zweryfikuj ustawienia kompilatora. Może to w nich leży problem.....

#3 rEaLaPpLeFaN

rEaLaPpLeFaN
  • 708 postów

Napisano 16 maja 2013 - 16:02

Co to znaczy że mają ten sam silnik? W ustawieniach kompilatora nie gmerałem. XCode jest świeżo zainstalowany.

#4 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 16 maja 2013 - 17:32

A może problem leży w znakach nowej linii w pliku? Windows ma swoje...

#5 rEaLaPpLeFaN

rEaLaPpLeFaN
  • 708 postów

Napisano 16 maja 2013 - 17:48

A może problem leży w znakach nowej linii w pliku? Windows ma swoje...

Ale to nie jest ten sam plik. Były osobno tworzone na Macu i pod Windą. Poza tym wątpię, bo Mac idealnie pokazuje linijki jedna pod drugą czyli wie gdzie jest koniec linii. Żeby osiągnąć ten sam efekt w Visual Studio trzeba użyć pętli (co jest logiczne).

- - - Połączono posty - - -

Stworzyłem plik od nowa i działa normalnie.. Chyba mi się zdawało że stworzyłem je osobno. Trudno :)
Przy okazji zapytam o coś innego. Mogę odczytać z biurka (czy pulpitu, jak kto woli) plik, który już tam jest, ale nie mogę utworzyć nowego (mam na myśli kod umieszczony w pierwszym poście). Jak to obejść?

#6 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 16 maja 2013 - 17:54

Na przyszłość używaj na forum znacznika [ php ] zamiast [ code ] - samo pokoloruje składnie (jako-tako) i pozwala wstawiać znaki < i >

#7 ja_sam

ja_sam
  • 117 postów
  • SkądToruń/Bobolin

Napisano 28 maja 2013 - 18:47

Co to znaczy że mają ten sam silnik? W ustawieniach kompilatora nie gmerałem. XCode jest świeżo zainstalowany.

tzn że XCode tak naprawdę jest C++ czyli używasz tej samej składni i pod Mac i pod Win :)

#8 tmkszlc

tmkszlc

  • 1 846 postów
  • SkądSzczecin, PL

Napisano 28 maja 2013 - 19:42

Wydaje mi się, że jako drugi parametr podawać powinieneś liczbę znaków. Zdaje się, że ciąg w pierwszym parametrze zostaje zmodyfikowany do tego ,który chcesz odczytać. Spróbój

getline( ciag_znak, rozmiar );

ciąg znaków to ten, z którego wyciągasz i ten, który zostanie zwrócony z jedną linią. Aczkolwiek mogę się mylić ponieważ nie znam C++.

#9 traju

traju
  • 48 postów

Napisano 29 maja 2013 - 13:23

Kwestia w jaki sposób zapisujesz plik. Jesteś pewien, że zapisujesz uprzednio plik jak trzeba? Wydaje mi się, że problem może też wynikać z trochę innego zapisu plików tekstowych pod windowsem i systemami unix-like. Kod nowej linii w tych systemach różni się. Możliwe, że dlatego odczytujesz cały plik. Niestety nie za bardzo kojarzę czy klasa ifstream radzi sobie z tą różnicą. Wydaje mi się, ze najprostszym wyjściem, aby to sprawdzić byłoby zapisanie i odczytanie pliku w trybie binarnym. Myślę, że powinno to zaradzić na Twój problem. @up To też jest wyjście. Odczytać plik to jakiegoś tymczasowego stringa i potem wrzucić x pierwszych znaków do docelowego. Tylko trzeba wiedzieć ile zadany tekst ma znaków. Drugim wyjściem byłoby zapisanie z jakimś separatorem zamiast nowej linii i wtedy odczytywanie pliku i gdy natrafi się na separator to wrzucanie dotychczasowych znaków do stringa i to zapętlić jeśli miałby być odczytany cały lub przerwać jeżeli potrzebujemy tylko tej części do separatora.




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych