Wątek przeniesiony 2017-03-31 18:38 z C/C++ przez kq.

zapis do stringa i naruszenie ochrony pamięci

0

witam słuchajcie rzućcie na to oko coś mi się z kompilatorem dzieje czy co się tu dzieje:

#include <iostream>
#include <math.h>
#include <string>
#include <fstream>
using namespace std;
int main()
{

    fstream plik;
    plik.open("p.txt");

    string a;
    char b;
    cout << b;
    long i;
    for (i = 0; i < 153680; i++) {
        plik.get(b);
        cout << b;
        a[i] = b;
    }

    return 0;
}

kompiluje i potem:

rebus@Rebus-N53SV:~/Dokumenty/cpp$ g++ proglicz.cpp 
rebus@Rebus-N53SV:~/Dokumenty/cpp$ ./a.out
Naruszenie ochrony pamięci (zrzut pamięci)
rebus@Rebus-N53SV:~/Dokumenty/cpp$ 
0

Z kompilatorem nic się nie dzieje.

a[i]=b;

Dostęp (i zapis) do i-tego znaku 0-znakowego stringa to UB. Pewnie chciałeś użyć push_back, albo resize wcześniej.

PS: poprawiłem formatowanie. Strasznie nieprzyjemnie się to czytało. Na przyszłość jak sam nie umiesz to przepuść kod przez http://format.krzaq.cc

0

jak w pliku txt są litery to działa jak same cyfry to nie wcześniej działało mi

#include<iostream>
#include<math.h>
#include<string>
#include<fstream>
using namespace std;
int main() {

fstream plik;plik.open("p.txt");

string a;
char b;
long i=0;

while(!plik.eof()){
plik.get(b);
cout<<b;
a[i]=b;
i++;}



return 0;
}

teraz nie idzie jak to się dzieje raz działa innym razem nie

1

Tak jak pisałem UB. Program jest błędny, bo do zero-elementowego stringa zapisujesz elementy bez zmiany jego rozmiaru. Odpowiedź dostałeś w pierwszym poście.

0

mam książkę szkołą programowania C++ Stephen Prata wydanie IV o stringach tu jest i tak jak się uczyłem powinno działać to dlaczego jak w pliku txt są litery to działa można odczytać potem np: ```cpp

cout<<a[10];

i wyświetla literę a nie

Naruszenie ochrony pamięci (zrzut pamięci)
1

Jeśli taki przykład jest w książce to książka ma błąd, ale zapewne niepoprawnie go przepisujesz. Dlaczego zamiast zastosować się do porad brniesz w błędne rozwiązania?

0

hmm to co zrobić żeby się ten string powiększał zawsze było tak że sam się powiększa automatycznie tym różni się string od char nie to nie przykład z książki tak się uczyłem z niej po prostu.
dziwi mnie nieraz raz działa na następny wieczór nie działa. jeszcze jakbym coś w kodzie zmieniał a nic nie zmieniałem ani mi się kompilator nie aktualizował

1

Naprawdę tak ciężko przeczytać pierwszą odpowiedź? push_back albo resize.

0

nie znam tego ok poczytam o tym dzięki

Ok działa mi pściej to zrobiłem plik>>a; zamiast tam po znaku dopuki nie wczyta się znak końca pliku 😁

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