• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmiana formatu końca linii <fstream>

Object Storage Arubacloud
0 głosów
208 wizyt
pytanie zadane 20 marca 2020 w C i C++ przez Badzonor Obywatel (1,410 p.)
Witam mam problem z zapisem pliku do formatu Unix (LF) z użyciem biblioteki fstream. Chcę z tablicy char zrobić plik. W tym przypadku *.bmp i jak mówi notepad++ plik ten normalnie jest w formacie Unix (LF), i wtedy grafika wygląda tak jak powinna, w formacie Windows (CR LF) obrazek się rozjeżdża - normalne, a w formacie Macintosh (CR) wygląda niby ok ale są pewne błędy.

Problem jest następujący: gdy wpisuje plik << "\r";  format to Mac - ok,

gdy wpisuje plik << "\n\r"; robią się 2 "entery" i tekst w notepad jest co drugą linię (obrazek mocno rozjechany) a format to Windows,

a gdy wpisuje plik << "\n"; to obrazek jest mniej rozjechany a format to też Windows.

jak mam uzyskać format Unix?

Pozdrawiam, Dominik.

1 odpowiedź

+1 głos
odpowiedź 20 marca 2020 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 20 marca 2020 przez Badzonor
 
Najlepsza
Znak nowej linii jest zależny od implementacji i środowiska. Kompilując na Windowsa \n będzie oznaczać CR LF itd. Najbezpieczniej zapisywać dane binarnie. Użyj flagi `std::fstream::binary` podczas otwierania pliku.
komentarz 20 marca 2020 przez Badzonor Obywatel (1,410 p.)
Dzięki, pomogło
komentarz 20 marca 2020 przez Badzonor Obywatel (1,410 p.)

@Patrycjerz, Witam, jednak pojawił się problem którego nie potrafię rozwiązać. Potrzebuje skopiować treść jakiegoś dowolnego pliku do tablicy char lub byte oraz program który stworzy plik z tablicy char lub byte. Oto mój aktualny kod:

Zapis:

#include <iostream>
#include <sstream>
#include <fstream>
#include <windows.h>

using namespace std;

int data_length=2998;
char data[data_length]= {66, 77, 182, 11, 0... ...0, 0, 54, 0, 0, 0, 40};

int main()
{
    //data[0]=97; data[1]=98;data[2]=99;data[3]=100;data[4]=101;
     fstream plik;
     stringstream filename;

     filename << "C:/Users/Dominik/Desktop/TEST/file6.bmp";

     plik.open(filename.str().c_str(), ios::out | std::fstream::binary);
     for(int i=0; i<data_length; i++)
     {
         plik << data[i];
     }
     plik.close();
     return 0;
}

Odczyt:

#include <iostream>
#include <sstream>
#include <fstream>
#include <windows.h>

using namespace std;

int main()
{
    fstream plik;
    stringstream filename;

    filename << "C:/Users/Dominik/Desktop/TEST/file5.bmp";
    plik.open(filename.str().c_str(), ios::in);
    if(plik.good())
    {
        //  char bytes[16];
        plik.seekg (0, plik.end);
        int leng = plik.tellg();
        plik.seekg (0, plik.beg);
        char data[leng];
        bool t = plik.read(&data[0], leng);
        //cout << t << " " << int(bytes[0]);
        string val;
        for(int i=0; i<leng; i++)
        {
            // byte val=all[i];
            byte val=data[i];
            cout <<  int(val) << ", ";
            if((i%15)==14) cout<<endl;
        }
         cout<<endl<<"Length: "<<leng<<endl;
    }
    else cout << "No such file";
    plik.close();
    return 0;
}

Pliki .bmp działają, w plikach .txt nie ma enterów a .png nie działają wcale. Działają teraz tylko pliki Unix. Jak w 100% skopiować treść pliku i ją potem zapisać aby działały wszystkie rodzaje plików?
Dopowiem jeszcze jaki jest w tym cel bo może to budzić konsternację ;) Tworzę zegarek w którym będzie karta sd oraz moduł radiowy NRF24L01 i chcę przesyłać pliki od zegarka do komputera i na odwrót.

komentarz 21 marca 2020 przez j23 Mędrzec (194,920 p.)

Do odczytu i zapisu plików binarnych używaj metod to tego przeznaczonych, czyli read i write.

komentarz 21 marca 2020 przez Badzonor Obywatel (1,410 p.)
Też o tym myślałem, przed chwilą sprawdziłem i nic niestety się nie zmieniło.
komentarz 21 marca 2020 przez Badzonor Obywatel (1,410 p.)
Ok, rozwiązałem problem przy odczycie pliku też dopisałem flagę "std::fstream::binary" i teraz działają już wszystkie pliki. Dziękuję za pomoc, pozdrawiam!

Podobne pytania

0 głosów
2 odpowiedzi 253 wizyt
pytanie zadane 6 października 2016 w C i C++ przez BezNazwy Użytkownik (540 p.)
0 głosów
1 odpowiedź 100 wizyt
pytanie zadane 30 kwietnia 2016 w C i C++ przez Andrzej Piotr Nowak Nowicjusz (140 p.)
0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 13 sierpnia 2019 w C i C++ przez Bulbi Początkujący (250 p.)

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...