Wczytywanie pliku funkcją LoadFromFile() ze znakiem nowej linii

0

Witam,
Wczytuję plik tekstowy .txt używając funkcji LoadFromFile() a w tekście w środku wiersza występuje znak nowej linii '\n'.
Funkcja LoadFromFile() traktuje ten znak jak nowa linia i dzieli wiersz w tym miejscu tworząc nowy wiersz

W notatniku systemowym Windows tekst wygląda tak: Ala ma asa
W programie wczytującym ten plik już wygląda inaczej:

plik->LoadFromFile(_sciezka,  TEncoding::ASCII);

for( short int i = 0; i < plik->Count; ++i )
   Memo1->Lines->Add( plik->Strings[i] );

W Memo1 tekst wygląda już tak:

Ala
ma asa

Czy można usunąć znak '\n' żeby wiersz był w całości i jakim sposobem?

0

Użyj std::ifstream i std::getline - problem zniknie.

1

Problemem jest notatnik, który tylko wyłącznie uznaje windowsowe znaki końca linii, czyli dwa bajty \r\n.
Na innych systemach znakiem końca linii jest jeden bajt \n (czasem \r).
Każdy inny edytor nawet na Windows, traktuje różne oznaczania końca linii równoważnie.
Większość IDE ma opcję normalizowania znaków końca linii, ba nawet git ma taką opcję.

0
0x666 napisał(a):

Użyj std::ifstream i std::getline - problem zniknie.

Niestety nadal jest podział widoczny w Memo1

std::wfstream odczyt;
  std::wstring dane;

  odczyt.clear();
  odczyt.open ( _sciezkaj.c_str() );

	while( std::getline( odczyt, dane, L'\n' ))
	{
		//while ( getline( dane2, dane, L'\n' ) )
		Memo1->Lines->Add( dane.c_str() );
	}
	odczyt.close();
0

getline czyta poprawnie linię? Jeśli tak, to sprawdź (debuggerem), co jest między Ala i ma. To trochę dziwne, że w notatniku masz jedną linię, a czyta Ci dwie.

0

"Ala ma asa" było początkowo w excelu z nową linią w środku. Zapisałem plik jako csv i otworzyłem w notatniku i w nim nie ma podziału ale faktycznie znak \n istnieje. Funkcja getline() ciągnie wiersze bez znaku \n i to już jest za późno żeby go szukać po zaczytaniu dlatego szukam możliwość żeby zaciągnąć cały wiersz ze wszystkimi znakami i usunąć je zanim wczytam do obiektu np String

0

Internety mówią, że pola z EOL-em powinny być wzięte w cudzysłów. Czy jest tak u Ciebie?

0
0x666 napisał(a):

Internety mówią, że pola z EOL-em powinny być wzięte w cudzysłów. Czy jest tak u Ciebie?

Nie, i być tak nie chce. Jedynie tak się kompiluje

getline( odczyt, dane ) )
getline( odczyt, dane, L'\n' ) )

0

Hasło w Google: c++ csv parser new lines
Odpowiedź: http://www.zedwood.com/article/cpp-csv-parser

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