Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [fstream][C++] problem z tworzeniem pliku
Forum PHP.pl > Inne > Hydepark
toaspzoo
Witam, mam taki kod do tworzenia pliczków....
Chciałbym, żeby te pliki coś ważyły, np. każdy po 1MB

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.  
  10.  
  11.  
  12. string nazwa;
  13.  
  14. int i;
  15.  
  16. for(i=0;i<500;i++)
  17. {
  18. nazwa = i;
  19.  
  20. fstream strumien_zapisu;
  21. strumien_zapisu.open(nazwa.c_str() ,ios::out);
  22.  
  23. }
  24.  
  25.  
  26. }
1010
Czy ten temat pasuje do tematyki forum?
nasty
Kod
#include <fstream>

void main()
{
    char temp_buff[4 /* <- tu ilość cyfr w liczbie plików + 1 (na NULL-a) */];    
    size_t advance_pos = (1024* 1024) - 1;
    for(int i = 500; i; --i) {
        _itoa_s(i, temp_buff, _countof(temp_buff), 10);
        std::ofstream out(temp_buff, std::ios::out);
        out.seekp(advance_pos);
        out.put(NULL);
        out.close();
    }
}
toaspzoo
Dzięki sprawdze
@up to jest hydepark!
toaspzoo
Ale wywala błąd
Kod
10 C:\Documents and Settings\P4\Pulpit\virus.cpp `_countof' cannot be used as a function
nasty
Jakiego kompilatora używasz?
To jest makro w visual c++, możesz jednak sobie je sam zdefiniować:

Kod
#define _countof(ar) (sizeof(ar)/sizeof(ar[0]))
toaspzoo
Teraz wywala to:

Kod
`_itoa_s' undeclared (first use this function)


używam dev c++
Speedy
Lol - virus.cpp. Człowieku, daj spokój wink.gif. Najpierw poznaj podstawy i się angielskiego naucz, a potem się bierz za wirusy. Podejrzewam, że _itoa_s jest jakąś wbudowaną funkcją kompilatora w Visual Studio. Dev C++ standardowo korzysta z g++, więc jak nie załączałeś żadnej dodatkowej biblioteki, to tam takiej funkcji pewnie nie ma. Z tego, co pamiętam, to bibliotece standardowej jest taka funkcja itoa i to pewnie o nią chodzi, więc sobie popraw nazwy.
nasty
_itoa_s jest bezpieczną wersją _itoa, która pozwala zapobiedz problemom z przepełnieniem buffora - tak zwane stack overflow. Jest ona częścią Visual C++ Runtime.
Ogólnie to polecam używanie tych bezpiecznych wersji zamiast zwykłych, szczególnie jak nie jesteś jeszcze doświadczony w C/C++ i nie wiesz jak obchodzić się z pamięcią.
Żeby używać tych bezpiecznych wersji, podmień kompilator w swoim edytorze na VC++ albo użyj darmowego Visual C++ 2010 Express.
toaspzoo
Cytat
Lol - virus.cpp. Człowieku, daj spokój


Virus, nazwałem go tak, bo mój młodszy brat chciał wink.gif
A co do angielskiego, to powiem Ci, że nawet nieźle mi idzie, w tamtym roku zdawałem egzamin FCE wink.gif
Mam 15 lat wink.gif


Uups... too many emoticons ;D
nasty
Cytat(Speedy @ 14.05.2011, 15:56:30 ) *
Lol - virus.cpp. Człowieku, daj spokój wink.gif. Najpierw poznaj podstawy i się angielskiego naucz, a potem się bierz za wirusy. Podejrzewam, że _itoa_s jest jakąś wbudowaną funkcją kompilatora w Visual Studio. Dev C++ standardowo korzysta z g++, więc jak nie załączałeś żadnej dodatkowej biblioteki, to tam takiej funkcji pewnie nie ma. Z tego, co pamiętam, to bibliotece standardowej jest taka funkcja itoa i to pewnie o nią chodzi, więc sobie popraw nazwy.

A jak ma poznać podstawy inaczej niż eksperymentująć? ;-)
Ciężko wymagać od 15stolatka wiedzy która pozwala na napisanie "poważnego" wirusa.

Sam zaczynałem od tego i moim pierwszym programem też był "wirus", z tym, że ja zanim nie męczyłem innych to najpierw sam szukałem odpowiedzi i nie traktowałem forum w internecie jako wyszukiwarka Google czy indeks w książce (za moich czasów ;P).
toaspzoo
Początkowo szukałem w google, ale nie znalazłem satysfakcjonującego mnie przykładu ;
Speedy
Cytat(toaspzoo @ 14.05.2011, 21:39:19 ) *
Virus, nazwałem go tak, bo mój młodszy brat chciał wink.gif
A co do angielskiego, to powiem Ci, że nawet nieźle mi idzie, w tamtym roku zdawałem egzamin FCE wink.gif
Mam 15 lat wink.gif


Uups... too many emoticons ;D


Okej. Skąd mogłem wiedzieć, ile masz lat wink.gif. Ja w wieku ok. 14 lub 15 lat pierwszy komputer dostałem. W kwestii angielskiego miałem na myśli to:

Cytat
Kod
`_itoa_s' undeclared (first use this function)


Masz wyraźnie napisane, że funkcja _itoa_s jest niezdeklarowana, dlatego Twój program nie chce się skompilować. Jeżeli zdałeś FCE, to powinieneś to zdanie zrozumieć wink.gif.

W devie, a raczej w g++ taki kod się skompiluje, choć wywali jakieś warningi.
Jedyne, co zrobiłem, to zamieniłem _itoa_s na itoa, zwracany typ danych funkcji main z void na int i dodałem return, bo z voidem w g++ się nie skompiluje.

Kod
#include <fstream>
#define _countof(ar) (sizeof(ar)/sizeof(ar[0]))

int main()
{
    char temp_buff[4 /* <- tu ilość cyfr w liczbie plików + 1 (na NULL-a) */];
    size_t advance_pos = (1024* 1024) - 1;
    for(int i = 500; i; --i) {
        itoa(i, temp_buff, _countof(temp_buff));
        std::ofstream out(temp_buff, std::ios::out);
        out.seekp(advance_pos);
        out.put(NULL);
        out.close();
    }
    return 0;
}
nasty
Speedy - źle.
Ostatni parametr w itoa to nie jest rozmiar bufora a podstawa alfabetu liczby. http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

Powinno być tak:

Kod
itoa(i, temp_buff, 10)
Speedy
Rzeczywiście. Chciałem sprawdzić na szybko, czy działa, a nie pamiętałem dokładnie składni funkcji itoa, która przyjmuje o 1 parametr mniej, niż _itoa_s.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.