problem z odczytem pliku przez fstream

0

Witam
(robię na builder c++)
Mam program (nie mój), który generuje plik csv. Jak załaduję ten plik do notepad++ to nie ma ustawionego żadnego formatu. A chciałbym aby był ANSI.
potrzebuję załadować ten plik przez

fstream plikCsv;
plikCsv.open(Sciezka.c_str(), ios::in);

i pobrać z niego informacje.
Jak nie ma określonego formatu to

getline(plikCsv, textLinii);
i pznak=textLinii.substr(0);

pokazuje mi ""
dopiero jak zmienię format pliku w notepad++ na konwertuj do ANSI to mogę pobierać zawartość i jest ok.
Tylko, że muszę pominąć notepada. Czy jest jakiś sposób, żeby dostać się do tej treści?

0

Merytorycznie:
nie ma czegoś takiego jak format ANSI.
Tego co piszesz bez wódki/jointa nie da się czytać. Co palisz? Mocne!

Programowanie (przynajmniej w narzędziach innych niż Borlandy) ma za fundament ścisłe i dokładne określenie sytuacji i celów.
Miałeś już odp w/s kodowania plików, efekt zerowy

0

Ok, wiem, że kodowanie ale chodziło mi o to, że w notepad wchodzę w menu Format.
Ale w dalszym ciągu proszę o informację, jak mogę dostać się do zawartości tego pliku, ponieważ fstream nic nie pokazuje.

0

Otwórz za pomocą "notepad++" i zobacz jakie jest kodowanie.
Dalej będzie z górki

0

@_13th_Dragon: no właśnie ten plik nie ma ustawionego kodowania, a przynajmniej notepad tego nie pokazuje.

1
tuz napisał(a):

Ok, wiem, że kodowanie ale chodziło mi o to, że w notepad wchodzę w menu Format.

Ale w dalszym ciągu proszę o informację, jak mogę dostać się do zawartości tego pliku, ponieważ fstream nic nie pokazuje.

No to może od początku, czy ten plik się otworzył poprawnie? Ścieżka jest poprawna, antywirus niczego nie blokuje?

fstream plikCsv;
plikCsv.open(Sciezka.c_str(), ios::in);
if (plikCsv.is_open()) {
     ...
} else {
     std::perror("plikCsv"); // wypisze błąd do strumienia błędów w czytelnej dla człowieka formie
}
0

@MarekR22: Nie zwraca błędu, niby otwiera plik prawidłowo ale nic mi nie pokazuje. Ustawiłem się na dalszych liniach i cały czas jest pusto. W załączniku jest plik oryginał oraz screen, który pokazuje, że jest ""
chyba, że coś źle robię.
Jednak, gdy w n++ robię konwertuj do formatu ansi to czyta prawidłowo.

marzec2020.zipscreen.jpg

0

@tuz: antywirusa żadnego nie ma, ścieżka na bank prawidłowa.

1

Ten obrazek to chyba pokazuje, że debuger wzeszedł do gałęzi else, czyli jest błąd.
Poza tym:

  1. while (!plik.eof()) jest częstym błędem powinno być:
while (std::getline(plikCsvM, textLinii)) {
  1. textLinii.substr(0); to zaproszenie do "Undefined behavior". Jeśli linia będzie pusta.
0

@MarekR22: nie wszedł do else, tam postawiłem brekpointa ale zatrzymał się niżej, tego nie ma na screenie, chciałem pokazać co wyświetla substr(0);
zaraz sprawdzę te sugestie

0

@MarekR22: zmieniłem ale bez zmian, cały czas pokazuje "" poza pierwszą linią, tam pokazuje znak 0 E i koniec.

fstream plikCsvM;
plikCsvM.open(Sciezka.c_str(), ios::in);
if (plikCsvM.is_open()) {
    while (std::getline(plikCsvM, textLinii)) {
     pznak=textLinii.substr(0); (tu sobie sprawdzam co pobiera)
    }
} else {
     std::perror("plikCsvM"); // wypisze błąd do strumienia błędów w czytelnej dla człowieka formie
}

0

Może załącz do postu ten twój plik (w zipie)

Lub sam zwyczajnie sprawdź co tam siedzi.

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;


int main()
{
	string path="c:\\temp\\smiec.cpp";
	ifstream fin(path);
	if(fin)
	{
	    for(int ch;(ch=fin.get())!=EOF;) cout<<setw(2)<<setfill('0')<<hex<<ch<<' '<<(char)ch<<endl;
	    fin.close();
	}
	else perror("fin");
    return 0;
}
0

@_13th_Dragon: plik już dodałem kilka postów wyżej
później wykonam ten kod i dam znać, bo teraz nie mogę
ale, póki co i tak wielkie dzięki za zainteresowanie i pomoc, bo wielu jest którzy udają, że coś wiedzą i wpisują głupie uwagi a merytorycznie nie potrafią nic powiedzieć

0

@tuz: Dobra, wykonałem ten kod. Jak wybrałem dobry plik, czyli po zmianie w n++ na ANSI, to poszła mi długa lista, dwie kolumny, w drugiej kolumnie miałem właściwy tekst z pliku.
Jak dałem plik oryginalny (czyli bez miany na ANSI) to też leciały 2 kolumny, w drugiej też tekst z pliku tylko, że po każdym znaku pokazuje spację.
Jak odpaliłem oba pliki w programie hxd to widać to samo co pokazał ten wykonany kod. Zrobiłem jeszcze tak, że pobrałem zawartość złego pliku do stringlisty i zapisałem do innego pliku, zapisał się tylko jeden znak E. Teoretycznie można by z pobranego tekstu usunąć spacje ale to będzie problem, bo ja chcę ładować kolejne linie tego tekstu i wyszukiwać pewne wartości, i też wyszukuję tam spacji. W załączniku dałem plik przed zmianą plikb i po zmianie na ansi pliko. Proszę o pomoc bo ja nie mam zielonego pojęcia jak się do tego pliku dostać.
pliki.7z

1
tuz napisał(a):

@tuz: Dobra, wykonałem ten kod. Jak wybrałem dobry plik, czyli po zmianie w n++ na ANSI, to poszła mi długa lista, dwie kolumny, w drugiej kolumnie miałem właściwy tekst z pliku.

Jak dałem plik oryginalny (czyli bez miany na ANSI) to też leciały 2 kolumny, w drugiej też tekst z pliku tylko, że po każdym znaku pokazuje spację.
Jak odpaliłem oba pliki w programie hxd to widać to samo co pokazał ten wykonany kod. Zrobiłem jeszcze tak, że pobrałem zawartość złego pliku do stringlisty i zapisałem do innego pliku, zapisał się tylko jeden znak E. Teoretycznie można by z pobranego tekstu usunąć spacje ale to będzie problem, bo ja chcę ładować kolejne linie tego tekstu i wyszukiwać pewne wartości, i też wyszukuję tam spacji. W załączniku dałem plik przed zmianą plikb i po zmianie na ansi pliko. Proszę o pomoc bo ja nie mam zielonego pojęcia jak się do tego pliku dostać.

Chyba uwielbiasz poruszać się na oślep bez grama podkładu.
Jesteś tydzień w walce z wiatrakami, zamiast 30 minut czytania.

Lektura obowiązkowa: multibyte encoding (Microsoft), Unicode (standard).
Jak ustalisz w czym to naprawdę jest, prawie jesteś w domu.

0

@AnyKtokolwiek: Dajesz mi kij zamiast marchewki. Jeżeli wiesz jak to zrobić, zlituj się i napisz mi jak to zrobić, czy może nie da się tego zrobić albo konieczna jest jakaś biblioteka.
Do tej lektury będę mógł usiąść dopiero wieczorem.

0

Zamień:
std::string -> std::wstring
std::fstream -> std::wfstream
std::cout -> std::wcout

Jak chcesz działać na "zwyczajnych" stringach to musisz to jakoś skonwertować.
Standard ma std::wstring_convert - deprecated dla c++17, ale zamiennika chyba nie ma.
Albo szukaj jakiejś biblioteki.

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