Złapanie wyjątku przy otwieraniu pliku

Złapanie wyjątku przy otwieraniu pliku
Blackhole
  • Rejestracja:prawie 19 lat
  • Ostatnio:3 miesiące
  • Postów:81
0

Hej!
Cześć mego kodu działającego jako proces w tle, który w pętli uruchamiany jest co 3 sek., wygląda tak:

Kopiuj
try {
	try {
		SaveLog(txt2string("Będzie zaraz fopen pliku ").append(nazwa));

		struct stat stats;
		struct tm dt;
		char  ctime_txt[70], mtime_txt[70], atime_txt[70];
		stat(nazwa.c_str(), &stats);
		string	faccess;

		dt = *(localtime(&stats.st_ctime));
		sprintf(ctime_txt, "created: %4d-%02d-%02d %02d:%02d:%02d",		dt.tm_year + 1900, dt.tm_mon+1, dt.tm_mday,		dt.tm_hour, dt.tm_min, dt.tm_sec);
		dt = *(localtime(&stats.st_mtime));
		sprintf(mtime_txt, "   modified: %4d-%02d-%02d %02d:%02d:%02d",		dt.tm_year + 1900, dt.tm_mon+1, dt.tm_mday,		dt.tm_hour, dt.tm_min, dt.tm_sec);
		dt = *(localtime(&stats.st_atime));
		sprintf(atime_txt, "   accessed: %4d-%02d-%02d %02d:%02d:%02d",		dt.tm_year + 1900, dt.tm_mon+1, dt.tm_mday,		dt.tm_hour, dt.tm_min, dt.tm_sec);

		faccess = "File access: ";
		if (stats.st_mode & R_OK)	faccess.append("r");	else	faccess.append("-");
		if (stats.st_mode & W_OK)	faccess.append("w");	else	faccess.append("-");
		if (stats.st_mode & X_OK)	faccess.append("x");	else	faccess.append("-");

		SaveLog(txt2string(ctime_txt).append(txt2string(mtime_txt)).append(txt2string(atime_txt)).append("    fileSize=").append(int2string(stats.st_size)).append("B    ").append(faccess));

		SaveLog("before fopen");
		fi = fopen(nazwa.c_str(), "rb");
		SaveLog("after fopen");
	} catch (exception &e) {
		SaveLog("exception przy fopen");
		SaveLog(txt2string("Błąd otwierania pliku '").append(nazwa).append("':  ").append(e.what()));
	}
}
catch (...) {
	SaveLog(txt2string("Nieudane otwieranie pliku '").append(nazwa).append("'"));
}

log = DEBUGproc_txt;
log.append("  try #0.b ");
SaveLog(log);


Do loga zapisuje mi on:

Kopiuj
2022-11-07 17:12:45   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:45   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:45   before fopen
2022-11-07 17:12:45   after fopen
2022-11-07 17:12:45   __ DEBUG_proc: main > GetInVector  try #0.b 
2022-11-07 17:12:48   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:48   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:48   before fopen
2022-11-07 17:12:48   after fopen
2022-11-07 17:12:48   __ DEBUG_proc: main > GetInVector  try #0.b 
2022-11-07 17:12:51   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:51   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:51   before fopen
2022-11-07 17:12:51   after fopen
2022-11-07 17:12:51   __ DEBUG_proc: main > GetInVector  try #0.b 
2022-11-07 17:12:54   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:54   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:54   before fopen

W tym miejscu log się kończy, a proces przestaje istnieć.
Nie jestem w stanie dowiedzieć się, z jakiego powodu nie nagle nie udało się otworzyć pliku, a zamiast tego proces znika. TRY-CATCH powinno chyba przechwycić wyjątek, a tu nic.

Proszę o pomoc,
Jacek


edytowany 2x, ostatnio: Riddle
Miang
zamykasz gdzieś ten plik?
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
5
  1. Bardzo źle moje oczy akceptują straszny mix C i C++
    jak widzę str.c_ctr() aby uzyskać kompatybilność z C, to mi sie coś w środku przekręca.

  2. funkcje C nie rzucają wyjątkami, gdybyś używał zamiast fopen() np strumieni, by się włączyły w obługe wyjatków

  3. w C/C++ jeszcze jedną nieprzyjemną cechą jest, ze może zajść wyjątek systemowy (general protecion fault etcx), który by się tu nie złapał w catch, tylko proces zostanie zabity

  4. pominę, ze jest tu wiele atrybutów niskiej jakosci, nie zamykane pliki itd. Jak mówisz to uruchamiasz współbieżnie, strach się bać.

  5. jak widzę drabinkę try { bez żadnego kodu który by różnicował, to nie wierze, że panujesz nad projektem.
    Prywatnie mnie przeraża 90% przewaga kody logujacego nad merytorycznym, ale być może w szczególnym projekcie itd...

    Jesli funckaj SaveLog() buforuje sama w sobie, lub robi to "underlying level", właściwie trudno coś wnioskować z końca logu. MOŻE się niektóre wykonują, może nie.,

  6. nigdy bym tak nie używał * locatime() (to funkcja, może czytałeś, zwracająca pointer na jeden bufor statyczny). Jak bym jej nigdy nie kopiował operatorem gwiazdkowym, tylko korzystał ze wskaznika. Nie umiem wytłumaczyć dlaczego, takie wzorce w palcach


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 7x, ostatnio: Riddle
ZD
Miałem nosa, bo widzę w innym wątku cierpisz na GPF
CZ
Co do nr1 to nieraz nie da się inaczej, ponieważ niektóre biblioteki są stworzone tak, aby były kompatybilne z C. W związku z tym nie ma możliwości obejścia tego.
Blackhole
  • Rejestracja:prawie 19 lat
  • Ostatnio:3 miesiące
  • Postów:81
0
ZrobieDobrze napisał(a):

Bardzo źle moje oczy akceptują straszny mix C i C++
jak widzę str.c_ctr() aby uzyskać kompatybilność z C, to mi sie coś w środku przekręca.

funkcje C nie rzucają wyjątkami, gdybyś używał zamiast fopen() np strumieni, by się włączyły w obługe wyjatków

w C/C++ jeszcze jedną nieprzyjemną cechą jest, ze może zajść wyjątek systemowy (general protecion fault etcx), który by się tu nie złapał.

pominę, ze jest tu wiele atrybutów niskiej jakosci, nie zamykane pliki itd. Jak mówisz to uruchamiasz współbieżnie, strach się bać.

Ad 2) Możesz mnie nakierować na dokumentację, czego użyć zamiast fopen?
Ad 4) Plik jest zamykany trochę dalej, więc to akurat nie błąd.


ZD
strumień sie nazywa stream
enedil
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 18 godzin
  • Postów:1027
2

Jak działa txt2string? Bo te użycia txt2string("coś").append("coś").append("coś") bardzo przypominają use after free (tzn, używasz obiektu zwróconego z txt2string, a potem append zwraca tylko referencję do niego, natomiast sam obiekt umiera). Poza tym, jeśli proces kończy się sigsegv, albo abortem, to spore szanse, że bufor związany z twoim plikiem z logami nie jest spłukiwany, i po prostu nigdy do tego pliku faktycznie nie trafia.

Zobacz pozostałe 4 komentarze
_13th_Dragon
@ZrobieDobrze: Moment, to dwa różne aspekty: 1. Kod powyżej gdzie prawdopodobnie w *ToString zwracana referencja; 2. Trudność napisania która nie jest ani na jeden znak trudniejsza bądź łatwiejsza od javy czy C#. @enedil, skąd pewność ze to std::cout? ostream &fun(ostream &cout) { return cout<<1<<"kg"<<endl; }
enedil
tak czy inaczej, ten twój cout żyje przez cały scope wyrażenia
_13th_Dragon
Ja przecież nie pytałem o czas życia, ja pytałem czym się różni od sekwencji kropkowej (pytałem o wspomnianych trudnościach realizacji sekwencji kropkowej w C++).
enedil
no ale problem był z tym że nie zrobisz tak po prostu make_temporary().method1().method2() (co by odpowiadało użyciu w innych językach). A jak sobie zrobisz auto t = make_temporary() a potem resztę, no to wiadomo że jest trywialne
_13th_Dragon
Z tym akurat nie da się nie zgodzić, z tym że to wcale nie z sekwencją kropkową jest ten problem.
Blackhole
  • Rejestracja:prawie 19 lat
  • Ostatnio:3 miesiące
  • Postów:81
0
enedil napisał(a):

Jak działa txt2string? Bo te użycia txt2string("coś").append("coś").append("coś") bardzo przypominają use after free (tzn, używasz obiektu zwróconego z txt2string, a potem append zwraca tylko referencję do niego, natomiast sam obiekt umiera). Poza tym, jeśli proces kończy się sigsegv, albo abortem, to spore szanse, że bufor związany z twoim plikiem z logami nie jest spłukiwany, i po prostu nigdy do tego pliku faktycznie nie trafia.

txt2string jest dziwaczne, bo to tylko:

Kopiuj
string txt2string(string p_txt) {
	return p_txt;
}

abym mógł dokładać .append()


edytowany 1x, ostatnio: Riddle
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1
Blackhole napisał(a):
enedil napisał(a):

Jak działa txt2string? Bo te użycia txt2string("coś").append("coś").append("coś") bardzo przypominają use after free (tzn, używasz obiektu zwróconego z txt2string, a potem append zwraca tylko referencję do niego, natomiast sam obiekt umiera). Poza tym, jeśli proces kończy się sigsegv, albo abortem, to spore szanse, że bufor związany z twoim plikiem z logami nie jest spłukiwany, i po prostu nigdy do tego pliku faktycznie nie trafia.

txt2string jest dziwaczne, bo to tylko:

Kopiuj
string txt2string(string p_txt) {
	return p_txt;
}

abym mógł dokładać .append()

Plomba (kolejna) żeby (przez niejawne rzutowanie) mieć "jakaś" kompatybilność z C-stringiem.
Suma tych plomb jest DLA MNIE zupełnie niewiarygodna.

A co do podstawowego zagadnienia: może użyć debugger'a?


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
1

@Blackhole czemu nie użyjesz:

Kopiuj
stringstream ss;
ss<<txt2string(ctime_txt)<<txt2string(mtime_txt)<<txt2string(atime_txt)<<"    fileSize="<<stats.st_size<<"B    "<<faccess;
SaveLog(ss.str().c_str());

?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
4
  1. Wywal cały ten kod, serio.
  2. Jeśli już łapiesz wyjątki, to łap std::exception const&.
  3. Jeśli masz w projekcie wyjątki niedziedziczące z std::exception, to patrz punkt pierwszy.
  4. Jeśli ten kod jest wynikiem Twojej pracy, to - no off - nie powinieneś zabierać się za nic latającego na produkcji. Jeszcze przed Tobą wiele nauki.

_13th_Dragon
Bardzo mi się podoba punkt 3 :D
MA
gorzej jak wejdzie w pętle nieskończoną
_13th_Dragon
niby jak, jeżeli wykona punkt 1, to warunek skoku z punktu 3-go już nie będzie spełniony ;)
MA
W sumie racja :P Ale człowiek tylko człowiekiem :D
kq
A jeśli będzie spełniony, to punkt trzeci będzie znów zasadny 😉
Blackhole
  • Rejestracja:prawie 19 lat
  • Ostatnio:3 miesiące
  • Postów:81
0

Czym mam zastąpić fopen() (bo to on powoduje zabicie procesu)?

PS. Jestem świadom, że moja znajomość C++ jest słaba.


edytowany 2x, ostatnio: Riddle
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1
Blackhole napisał(a):

Czym mam zastąpić fopen (bo to on powoduje zabicie procesu)?

PS. Jestem świadom, że moja znajomość C++ jest słaba.

  1. odróżniasz wyjątki języka i wyjatki systemowe (w językach dajacych kod maszynowy) ?
  2. Czym zastąpić ... zacytuję moją własną wypowiedź "ta wiedza jest na pierwszych 10 kartkach książki do C++, gdybyś takową czytał"

Co do ubijania procesu, zakładajac, że szerszy kod jest tej samej jakości, to tu już może chodzić po wszelkich UB, które przygotowałes wcześniej ... sądzę ze na pewno masz wiele UB

@kq +1

Jest nieetyczne, aby kolega kodował na produkcję.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
Blackhole
  • Rejestracja:prawie 19 lat
  • Ostatnio:3 miesiące
  • Postów:81
0
ZrobieDobrze napisał(a):

Jest nieetyczne, aby kolega kodował na produkcję.

Bez obaw, ja tylko hobbystycznie.


Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:2 minuty
  • Postów:2070
0

Podstawowe pytanie: A co "debuger" na Twój problem ?
Zasugerował bym zainteresowanie się gotowcem np. spdlog
oraz fmt (spdlog używa fmt)


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1
Blackhole napisał(a):
ZrobieDobrze napisał(a):

Jest nieetyczne, aby kolega kodował na produkcję.

Bez obaw, ja tylko hobbystycznie.

W mojej opinii wzięcie tematu który przerósł posiadane podstawy nie jest dydaktyczne.
Owszem, pot krew i łzy nauczą tej czy innej techniki, ale chaotyczne przypadkowe łapanie myszy (pytanie czy skuteczne, bo na pewno nie ekonomiczne) uczy potworną ilosć złych wzorców. +15% w jednym obszarze -40% w innym

Powiedziałbym że w C/C++ jest o wiele gorsze niż w innych jezykach, bo pacjent buduje w swoim mózgu skojarzenia "przeciez działa", ślepotę na UB / subtelne błędy
Np szalone drukowanie outputu zamiast podciągniecie się co do debugegra

Utrzymany w harmonijnych proporcjach rozwój teorii i praktyki, budowanie fundamentów - tego tzreba


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
2
Blackhole napisał(a):
Kopiuj
try {
	try {
    ....
	} catch (exception &e) {
		SaveLog("exception przy fopen");
		SaveLog(txt2string("Błąd otwierania pliku '").append(nazwa).append("':  ").append(e.what()));
	}
}
catch (...) {
	SaveLog(txt2string("Nieudane otwieranie pliku '").append(nazwa).append("'"));
}

Zastanowiłeś się w ogóle, cze taka forma tego kodu ma w ogóle sens?
Pierwszy raz widzę, by ktoś się jąkał w kodzie (to chyba najlepsze określenie).

Blackhole napisał(a):

Do loga zapisuje mi on:

Kopiuj
2022-11-07 17:12:45   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:45   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:45   before fopen
2022-11-07 17:12:45   after fopen
2022-11-07 17:12:45   __ DEBUG_proc: main > GetInVector  try #0.b 
2022-11-07 17:12:48   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:48   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:48   before fopen
2022-11-07 17:12:48   after fopen
2022-11-07 17:12:48   __ DEBUG_proc: main > GetInVector  try #0.b 
2022-11-07 17:12:51   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:51   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:51   before fopen
2022-11-07 17:12:51   after fopen
2022-11-07 17:12:51   __ DEBUG_proc: main > GetInVector  try #0.b 
2022-11-07 17:12:54   Będzie zaraz fopen pliku in/zt.in
2022-11-07 17:12:54   created: 2022-11-07 17:00:03   modified: 2022-11-07 17:00:03   accessed: 2022-11-07 17:00:05    fileSize=717B    File access: r--
2022-11-07 17:12:54   before fopen

W tym miejscu log się kończy, a proces przestaje istnieć.
Nie jestem w stanie dowiedzieć się, z jakiego powodu nie nagle nie udało się otworzyć pliku, a zamiast tego proces znika. TRY-CATCH powinno chyba przechwycić wyjątek, a tu nic.

To jest zwykły objaw crash-a. Debugowałeś ten kod? Użyłeś sanitizer-a/debuger-a?
Jak podasz kompletny kod, który się kompiluje, to znajdziemy ci to w 5 minut, bez czytania kodu, przepchnie sie kod przez standardowe narzędzia i od razu błąd sie znajdzie.
Swoją drogą czy masz jakieś ostrzeżenia podczas kompilacji?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
3

Próba połatania brakującego kodu, nie powoduje problemów (address sanitizer nic nie znajduje): https://godbolt.org/z/f4P9x9ara
Możliwe, że błąd jest w kodzie, którego nie widać, albo przez przypadek załatałem błąd.

Wniosek z łatania jest jeden. Nie opanowałeś podstaw C++ i bierzesz się za coś, co wykracza poza zakres twoich obecnych możliwości (próbujesz napisać proces działający w tle).
Lepiej zrobisz jak skupisz się na opanowani podstaw bez sięgania do API systemowego.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 6 godzin
  • Postów:2368
1
  1. Skąd wiesz, że wywala się fopen(). Może nawet nie jest wołane tylko proces ginie wcześniej? To prosto sprawdzić, wystarczy wywoływać proces via strace i logować wywołania systemowe.
  2. Masz jakiegoś core dumpa z tych wywaleń procesu? (Ustawione ulimit -S -c unlimited ?)
  3. Jeśli chcesz debugować ręcznie, to wywal te mechanizmy własnego logowania, wal komunikaty prosto na std::cout , przy uruchomieniu przekieruj stdout/err do pliku. Wykluczysz w ten sposób mechanizm logowania jako źródło problemu.
ZD
To samoróbne logowanie mi nasuwa takie same przypuszczenia
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Tworzysz taką oto klasę:

Kopiuj
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
using namespace std;

void SaveLog(const string &message)
{
	cerr<<message<<endl;
}

class Log
{
	private:
	stringstream ss;
	public:
	string str()const { return ss.str(); }
	void reset() { ss.str(""); }
	operator string()const { return str(); }
	void save()
	{
		SaveLog(str());
		reset();
	}
	template<typename T> Log &operator<<(const T &str) { ss<<str; return *this; }
};


int main()
{
	Log log;
	(log<<"A="<<1<<"; B="<<2.5<<";").save();
	(log<<"C="<<setfill('0')<<setw(3)<<7<<";").save();
	(log<<"D=0x"<<hex<<setfill('0')<<setw(2)<<15<<";").save();
	return 0;
}

i masz problemy pozamiatane.

Aczkolwiek warto tą klasę mocno rozbudować, np. poprzez dodanie formatera daty i nie tylko.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
ZD
cerr ma wyłączone buforowanie by default ? Pytam bo nie wiem.
_13th_Dragon
cerr - nie powinien być buforowany no chyba że coś w międzyczasie w C++ się zmieniło. Aczkolwiek to endl i tak robi flush(). Poza tym sama funkcja SaveLog(...) to jedynie "mock" dla funkcji OP o tej samej nazwie.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
2

Próba ogarnięcia tego bałaganu:
https://godbolt.org/z/qb4xaxPc9

Kopiuj
#include <fstream>
#include <iostream>
#include <string>
#include <thread>
#include <chrono>

#include <fmt/chrono.h>
#include <fmt/ostream.h>

#include <sys/stat.h>
#include <unistd.h>

void print_file_status(const std::string& f)
{
    struct stat stats;
    struct tm dt;
    if (stat(f.c_str(), &stats) != 0) {
        std::perror("stat check");
        return;
    }

    dt = *(localtime(&stats.st_ctime));
    fmt::print(
        "    name: {}\n"
        " created: {:%Y-%m-%d %H:%M:%S}\n"
        "modified: {:%Y-%m-%d %H:%M:%S}\n"
        "accessed: {:%Y-%m-%d %H:%M:%S}\n"
        "fileSize: {}B\n"
        "File access: {}{}{}\n",
        f,
        fmt::localtime(stats.st_ctime),
        fmt::localtime(stats.st_mtime),
        fmt::localtime(stats.st_atime),
        stats.st_size,
        "-r"[!!(stats.st_mode & R_OK)],
        "-w"[!!(stats.st_mode & W_OK)],
        "-x"[!!(stats.st_mode & X_OK)]);
}

int main()
{
    const std::string nazwa = "example.cpp";

    try {
        fmt::print("now: {}\n\n", std::chrono::system_clock::now());
        print_file_status(nazwa);
        fmt::print("\nbefore open\n");
        std::this_thread::sleep_for(std::chrono::seconds(2));
        fmt::print("now: {}\n\n", std::chrono::system_clock::now());

        std::ifstream f{nazwa};
        f.exceptions(std::ios::badbit | std::ios::failbit);
        fmt::print("after open\n");
        print_file_status(nazwa);
    }
    catch (const std::system_error& e)
    {
        fmt::print("exception {} - {}\n", e.what(), e.code());
    }
    catch (const std::exception& e) {
        fmt::print("exception {}\n", e.what());
    }

    return 0;
}

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Marius.Maximus
dlaczego taka kolejność include ? [1] c++ [2] biblioteki [3] c ? Ostatnio mnie zastanawiał ten problem i znalazłem np. https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes. Jaki system najlepiej stosować ?
MarekR22
bez wyraźnej przyczyny. W obecnym projekcie mam regułę na sortowanie nagłówków i clang format to ogarnia za mnie, na godbolt nie ma możliwości by to skonfigurować.
Marius.Maximus
A było by wielkim nietaktem z mojej strony poprosić o wysłanie pliku ".clang-format" ?
MarekR22
Poszukaj w dokumentacji clang format: IncludeCategories: za pomocą wyrażeń regularnych można nadać priority nagłówkom (te same propriety są sortowane alfabetycznie).
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 3 godziny
  • Postów:1659
0

a sprawdź zamiast

Kopiuj
fi = fopen(nazwa.c_str(), "rb");

samo wywołanie

Kopiuj
nazwa.c_str();

dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
2
Miang napisał(a):

a sprawdź zamiast

Kopiuj
fi = fopen(nazwa.c_str(), "rb");

samo wywołanie

Kopiuj
nazwa.c_str();

Ja obstawiam każdą inną hipotezę.
nazwa.s_str() wydaje się jest drukowana niewiele wcześniej, i nie zachodzi z tym jakaś patologia. Oficjalnie nic jej nie zmienia.

Obstawiam również intensywnie takie scenariusze, jak przejechanie się po pamięci, gdzie jest tablica biblioteki standardowej FILE[] itd
Przy tak niskiej jakości kodu taka hipoteza wcale nie podlega natychmiastowemu odrzuceniu.
Wystarczy zamienić parametry fread() i mieć w d..ie warningi

NIE WIEMY, co jest / jakie szokujace rzeczy są w szerszym kontekście kodu, ten "profilaktycznie" jest ukrywany


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
edytowany 1x, ostatnio: ZrobieDobrze
RE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 5 godzin
3
Miang napisał(a):

a sprawdź zamiast

Kopiuj
fi = fopen(nazwa.c_str(), "rb");

samo wywołanie

Kopiuj
nazwa.c_str();

to nie to. w tym kodzie otworzył plik w teori. Został zwrócony wskaźnik na FILE. Jak by tam były pierdoły to powinien null pointer zwrócić. A później przy użyci tego fi teoretycznie powinien wszystko sprawdzić.

w ogóle o czym my też gadamy @Blackhole pierwsza sprawa przy debugowaniu tego bagna. GDB. podpiąć do procesu i obserwować co wyrzuci gdb. to powinien być twój pierwszy krok. To może rzucić nieco światła jak nie to ustawić breakpoint i krok po kroku.
edit:
gdybys nie znał gdb
link
można go używać z linii komend albo z jakiegoś IDE odpalić.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 3x, ostatnio: revcorey
Blackhole
  • Rejestracja:prawie 19 lat
  • Ostatnio:3 miesiące
  • Postów:81
0

Przerobiłem dostęp do plików z C (fopen) na C++ (fstream) i już się nie wywala.
Dzięki za pomoc.


MarekR22
Wystarczyło czytać co ci ludzie odpowiedzieli w tym ja. Nawet dostarczyłem ci wersję ze strumieniami https://4programmers.net/Forum/C_i_C++/364440-nie_moge_przechwycic_wyjatku?p=1875833#id1875833 i to ponad tydzień temu!
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)