Błędne końce linii \r\r\n ?

0

Wyświetlam na konsoli zawartość pamięci bufora mem oraz zapisuje do pliku. Użyłem funkcji spdlog::to_hex() bo niestety w fmt nie znalazłem gotowca.
Na konsoli jest poprawnie. W pliku jest poprawnie tylko w niektórych edytorach. Problemem jest blednę zakończenie linii \r\r\n

Czy problem jest w tym ze mieszam fmt i spdlog ?

#include <vector>
#include <fstream>

#include <fmt/format.h>
#include <fmt/chrono.h>
#include <spdlog/common.h>
#include <spdlog/fmt/bin_to_hex.h>

int main()
{

    // 
    std::vector <uint32_t> mem(0x5F);


    std::string filename = fmt::format("_memory_map_{:%Y%m%d_%H%M%S}.txt",  fmt::localtime(std::time(nullptr)) );
    std::ofstream file(filename);

    // display and write to file 
    auto print=[&](std::string &str)
    {
        fmt::print("{}",str);
        file << str;// << std::endl;
    };


    uint32_t baseAdr = -1;

    // "buf" temporary for to_hex
    std::vector<char> buf(mem.size()*4);
    std::memcpy(buf.data(),mem.data(),buf.size());
    std::string str = fmt::format("[{:x}] mem[{:x}]{}\n", baseAdr, mem.size(), spdlog::to_hex(buf));
    print(str);

    // fill mem
    for(auto &I:mem)
    {
        static uint32_t licznik{0};
        I = licznik++;
    }
    std::memcpy(buf.data(),mem.data(),buf.size());
    str = fmt::format("[{:x}] mem[{:x}]{}\n", baseAdr, mem.size(), spdlog::to_hex(buf));

    print(str);
}

https://godbolt.org/z/PYo3Ys8fa

Czy na "godbolt" można zobaczyć wygenerowany plik który powstał po uruchomieniu aplikacji ?

3
Adamek Adam napisał(a):

Czy na "godbolt" można zobaczyć wygenerowany plik który powstał po uruchomieniu aplikacji ?

Zapisz do stringstream odczytaj jako .str() i wyświetl w hex-mode

1

Problemem jest blednę zakończenie linii \r\r\n

W Windowsie strumień std::ofstream automatycznie zamienia \n na \r\n, więc jeśli wprowadzasz do niego windowsowy EOL, to będziesz miał w pliku \r\r\n.

0

sprawdzilem jak spdlog w taki sposób dodaje zakończenie linii w spdlog::to_hex(..)

    // put newline(and position header)
    template<typename It>
    void put_newline(It inserter, std::size_t pos)
    {
#ifdef _WIN32
        *inserter++ = '\r';
#endif
        *inserter++ = '\n';

        if (put_positions)
        {
            spdlog::fmt_lib::format_to(inserter, SPDLOG_FMT_STRING("{:04X}: "), pos);
        }
    }
};

bin_to_hex.h

Mam za niski level C++ aby ocenić czy to błąd ;)
Ja bym przychylił sie do uwagi @Azarien i wszędzie używał \n
Zgłosić BUG-a ?

2

IMO linii 5-7 nie powinno tam być, ale może koncept tej biblioteki jest jakiś inny (i dlatego nie nazwałbym tego błędem).

0

Odpowiedz od osoby z projektu na sugestię usunięcia \r:
You can open with binary mode to prevent this.

To kończy temat

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.