Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[C++]Problem z nadaniem daty do nazwy pliku


Rekomendowane odpowiedzi

Opublikowano

Siema, mam taki oto programik:

#include "stdafx.h"
#include "Win32Project2.h"
#include <Windows.h>
#include <wininet.h>


using namespace std;
int WyslijPlik(){
	HINTERNET hInternet;
	HINTERNET hFtpSession;
	if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else { cout << "Internet niedostepny.\n" << endl; return -1; }
	hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if (hInternet != NULL){
		hFtpSession = InternetConnect(hInternet, L"ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, L"baran860work.za.pl", L"haslo_ftp", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
		if (hFtpSession != NULL){
			if (FtpPutFile(hFtpSession, L"plik_do_wyslania.txt", L"nazwa_pliku_na_serwerze.txt", FTP_TRANSFER_TYPE_BINARY, 0)){
				InternetCloseHandle(hFtpSession);
				InternetCloseHandle(hInternet);
			}
			else {
				cout << "Nie wyslalem pliku." << endl;
				return -1;
			}
		}
		else return -1;
	}
	else  return -1;

	cout << "Pomyslnie wyslano plik.\n" << endl;

	return 0;
}
int main()
{	
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);
	WyslijPlik();
	
	return 0;
}

Program po uruchomieniu "pobiera" plik "plik_do_wyslania.txt" i następnie wysyła go na serwer ze zmienioną nazwą ("nazwa_pliku_na_serwerze.txt") jednak ja bym chciał aby nazwą pliku na serwerze była aktualna data, nie ważne w jakim formacie.

Np. "plik_"+"2014.04.21 13;40"+".txt";

 

 

Bardzo proszę o pomoc oraz wzięcie pod uwagę iż jestem początkujący.

 

8910814572903361049127.png

Opublikowano

Wykorzystaj ostreamstring

3587513.png


Potrzebujesz pomocy? Pisz śmiało na PW/Skype/Gadu-Gadu!


(albo napisz na forum... ^.^)

Opublikowano

Wykorzystaj ostreamstring

Zabardzo nie wiem w jaki sposób by to wykorzystać, może jakiś przykładzik? 

 

@Edit:

 

Wpisując w ten sposób:

 

 

if (FtpPutFile(hFtpSession, L"sysell.txt", L"nazwa_pliku_na_serwerze_">>"data.txt", FTP_TRANSFER_TYPE_BINARY, 0)){

Program się nie kompiluje.

8910814572903361049127.png

Weteran
Opublikowano
SYSTEMTIME time;
GetSystemTime(&time);
char buf[16];
sprintf(buf, "plik_%.4d-%.2d-%.2d.txt", time.wYear, time.wMonth, time.wDay);
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);

Są lepsze sposoby na ukrycie konsoli. W opcjach linkera zmień subsystem na windows. Chyba będziesz potrafił wygooglować jak to zrobić.

Opublikowano
SYSTEMTIME time;
GetSystemTime(&time);
char buf[16];
sprintf(buf, "plik_%.4d-%.2d-%.2d.txt", time.wYear, time.wMonth, time.wDay);

Są lepsze sposoby na ukrycie konsoli. W opcjach linkera zmień subsystem na windows. Chyba będziesz potrafił wygooglować jak to zrobić.

 

Robiąc tak:

#include "stdafx.h"
#include "Win32Project2.h"
#include <Windows.h>
#include <wininet.h>


using namespace std;
int WyslijPlik(){
	HINTERNET hInternet;
	HINTERNET hFtpSession;
	SYSTEMTIME time;
	GetSystemTime(&time);
	char buf[16];
	sprintf_s(buf, "plik_%.4d-%.2d-%.2d.txt", time.wYear, time.wMonth, time.wDay);

	if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else { cout << "Internet niedostepny.\n" << endl; return -1; }
	hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if (hInternet != NULL){
		hFtpSession = InternetConnect(hInternet, L"ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, L"baran860work.za.pl", L"haslo_ftp", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
		if (hFtpSession != NULL){
			if (FtpPutFile(hFtpSession, L"sysell.txt", buf, FTP_TRANSFER_TYPE_BINARY, 0)){
				InternetCloseHandle(hFtpSession);
				InternetCloseHandle(hInternet);
			}
			else {
				cout << "Nie wyslalem pliku." << endl;
				return -1;
			}
		}
		else return -1;
	}
	else  return -1;

	cout << "Pomyslnie wyslano plik.\n" << endl;

	return 0;
}
int main()
{	
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);
	WyslijPlik();
	
	return 0;
}

 

Wywala że nie może dokonać konwersji:

Błąd	1	error C2664: „BOOL FtpPutFileW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD_PTR)” : nie można dokonać konwersji argumentu 3 z „char [16]” do „LPCWSTR”	c:\users\baran860\documents\visual studio 2013\projects\win32project2\win32project2\win32project2.cpp	22	1	Win32Project2

Jak miałem zwykłego stringa ("nazwa_pliku_na_serwerze.txt") wystarczyło dodać przedrostek L (L"jakas tam nazwa") bo tyle udało mi się wygooglowac ;]

 

Ale za chuja nie wiem jak zrobić z typu char na jakiś LPCWSTR

 

 

 

@Edit:

 

Aha i kompilator się domagał użycia  zamiast "sprintf" to "sprintf_s"

8910814572903361049127.png

Opublikowano


#include "stdafx.h"

#include "Win32Project2.h"

#include <Windows.h>

#include <sstream>

#include <wininet.h>

using namespace std;

 

int WyslijPlik()

{

HINTERNET hInternet;

HINTERNET hFtpSession;

 

if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;

{ else cout << "Internet niedostepny.\n" << endl; return -1;}

 

hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);

if (hInternet != NULL)

{

hFtpSession = InternetConnect(hInternet, L"ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, L"baran860work.za.pl", L"haslo_ftp", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);

if (hFtpSession != NULL)

{

SYSTEMTIME st;

GetLocalTime(&st);

 

stringstream time;

time<<"Plik_"<<st.wYear<<"."<<st.wMonth<<"."<<st.wDay<<"_"<<st.wHour<<":"<<st.wMinute<<".txt";

 

if (FtpPutFile(hFtpSession, L"plik_do_wyslania.txt",time.str(), FTP_TRANSFER_TYPE_BINARY, 0))

{

InternetCloseHandle(hFtpSession);

InternetCloseHandle(hInternet);

}

else

{

cout << "Nie wyslalem pliku." << endl;

return -1;

}

}

else return -1;

}

else return -1;

 

cout << "Pomyslnie wyslano plik.\n" << endl;

 

return 0;

}

int main()

{

// Ukrycie konsoli

// HWND okno = GetConsoleWindow();

// ShowWindow(okno, SW_HIDE);

WyslijPlik();

 

return 0;

}

 

Weteran
Opublikowano

Masz domyślnie ustawione makro na używanie wide-stringów.

Aby użyć funkcji dla zwykłych stringów, musisz dodać 'A' do końca nazw funkcji, które używają stringów (albo zmienić makro).

Zamiast:

FtpPutFile(hFtpSession, L"sysell.txt", buf, FTP_TRANSFER_TYPE_BINARY, 0);

to:

FtpPutFileA(hFtpSession, "sysell.txt", buf, FTP_TRANSFER_TYPE_BINARY, 0);

(nie potrzebujesz wide-stringów?)

 

I dopiero teraz zauważyłem, że bufor sprintfa jest za mały.

Czyli zamiast tego:

char buf[16];

To:

char buf[32];
Opublikowano
#include "stdafx.h"
#include "Win32Project2.h"
#include <Windows.h>
#include <sstream>
#include <wininet.h>
	using namespace std;

int WyslijPlik()
{
	HINTERNET hInternet;
	HINTERNET hFtpSession;
	
if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else cout << "Internet niedostepny.\n" << endl; return -1; 
	
	hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hInternet != NULL)
	{	
	hFtpSession = InternetConnect(hInternet, L"ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, L"baran860work.za.pl", L"haslo_ftp", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
	if (hFtpSession != NULL)
		{	
		SYSTEMTIME st;
		GetLocalTime(&st);
		
			stringstream time;
			time<<"Plik_"<<st.wYear<<"."<<st.wMonth<<"."<<st.wDay<<"_"<<st.wHour<<":"<<st.wMinute<<".txt";
		
		if (FtpPutFile(hFtpSession, L"plik_do_wyslania.txt",time.str(), FTP_TRANSFER_TYPE_BINARY, 0))
			{
				InternetCloseHandle(hFtpSession);
				InternetCloseHandle(hInternet);
			}
			else 
			{
				cout << "Nie wyslalem pliku." << endl;
				return -1;
			}
		}
		else return -1;
	}
	else  return -1;

cout << "Pomyslnie wyslano plik.\n" << endl;

	return 0;
}
int main()
{	
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);
	WyslijPlik();
	
	return 0;
}

Nieee tak tez nie będzie ;]

 

To samo wywala:

Błąd	1	error C2664: „BOOL FtpPutFileW(HINTERNET,LPCWSTR,LPCWSTR,DWORD,DWORD_PTR)” : nie można dokonać konwersji argumentu 3 z „std::basic_string<char,std::char_traits<char>,std::allocator<char>>” do „LPCWSTR”	c:\users\baran860\documents\visual studio 2013\projects\win32project2\win32project2\win32project2.cpp	28	1	Win32Project2

oraz

	2	IntelliSense: no suitable conversion function from "std::basic_string<char, std::char_traits<char>, std::allocator<char>>" to "LPCWSTR" exists	c:\Users\baran860\Documents\Visual Studio 2013\Projects\Win32Project2\Win32Project2\Win32Project2.cpp	28	57	Win32Project2


@Edit:

 

Definiując stringa w "[";"]" podaje jego długość?

 

 

@Edit2:

A dodając do "FtpPutFile" A (FtpPutFileA)

Kompilator krzyczy to samo że nie można przekonwertować do LPCSRT

8910814572903361049127.png

Weteran
Opublikowano

Chyba zrobiłeś coś nie tak, bo powinno działać.

Czy twój kod wygląda tak?:

...
SYSTEMTIME time;
GetSystemTime(&time);
char buf[32];
sprintf_s(buf, "plik_%.4d-%.2d-%.2d.txt", time.wYear, time.wMonth, time.wDay);

if (FtpPutFileA(hFtpSession, "plik_do_wyslania.txt", buf, FTP_TRANSFER_TYPE_BINARY, 0)){
...
Opublikowano
time.str().c_str()

dodaj to do time zamiast:

time.str()


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Mój kod obecnie wygląda tak:

#include "stdafx.h"
#include "Win32Project2.h"
#include <Windows.h>
#include <sstream>
#include <wininet.h>
using namespace std;

int WyslijPlik()
{
	HINTERNET hInternet;
	HINTERNET hFtpSession;

	if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else cout << "Internet niedostepny.\n" << endl; return -1;

	hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if (hInternet != NULL)
	{
		hFtpSession = InternetConnectA(hInternet, "ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, "baran860work.za.pl", "hasloo", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
		if (hFtpSession != NULL)
		{
			SYSTEMTIME st;
			GetLocalTime(&st);

			stringstream time;
			time << "Plik_" << st.wYear << "." << st.wMonth << "." << st.wDay << "_" << st.wHour << ";" << st.wMinute << ".txt";

			if (FtpPutFileA(hFtpSession, "plik_do_wyslania.txt", time.str().c_str(), FTP_TRANSFER_TYPE_BINARY, 0))
			{
				InternetCloseHandle(hFtpSession);
				InternetCloseHandle(hInternet);
			}
			else
			{
				cout << "Nie wyslalem pliku." << endl;
				return -1;
			}
		}
		else return -1;
	}
	else  return -1;

	cout << "Pomyslnie wyslano plik.\n" << endl;

	return 0;
}
int main()
{
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);
	WyslijPlik();

	return 0;
}

Kompiluje się lecz podczas uruchomienia wyskakuje na 2sek:
"Internet dostepny, wysylanie pliku..\n" i okno się zamyka.

 

 

 

Jakich zmnian dokonałem:

-Zmieniłem nazwę funkcji "InternetConnect" na "InternetConnectA"

-Usunąłem L przy nazwie hosta, nazwie usera i haśle.

-Warunek i funkcja wysyłająca plik ma teraz taką postać:

if (FtpPutFileA(hFtpSession, "plik_do_wyslania.txt", time.str().c_str(), FTP_TRANSFER_TYPE_BINARY, 0))

Hasło zostało zmnienione na poprawne ;D

 

 

 

 

Edit:

Kod Xau wygląda teraz tak:

 

 

#include "stdafx.h"
#include "Win32Project2.h"
#include <Windows.h>
#include <sstream>
#include <wininet.h>
using namespace std;

int WyslijPlik()
{
	HINTERNET hInternet;
	HINTERNET hFtpSession;

	if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else cout << "Internet niedostepny.\n" << endl; return -1;

	hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if (hInternet != NULL)
	{
		hFtpSession = InternetConnectA(hInternet, "ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, "baran860work.za.pl", "hhhhh", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
		if (hFtpSession != NULL)
		{
			SYSTEMTIME time;
			GetSystemTime(&time);
			char buf[32];
			sprintf_s(buf, "plik_%.4d-%.2d-%.2d.txt", time.wYear, time.wMonth, time.wDay);

			if (FtpPutFileA(hFtpSession, "plik_do_wyslania.txt", buf, FTP_TRANSFER_TYPE_BINARY, 0)){
				InternetCloseHandle(hFtpSession);
				InternetCloseHandle(hInternet);
			}
			else
			{
				cout << "Nie wyslalem pliku." << endl;
				return -1;
			}
		}
		else return -1;
	}
	else  return -1;

	cout << "Pomyslnie wyslano plik.\n" << endl;

	return 0;
}
int main()
{
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);
	WyslijPlik();

	return 0;
} 

 

 

 

Lecz to samo co wyżej, kompiluje się lecz po połączeniu znika info.

8910814572903361049127.png

Opublikowano
#include "stdafx.h"
#include "Win32Project2.h"
#include <Windows.h>
#include <sstream>
#include <wininet.h>
using namespace std;

int WyslijPlik()
{
	HINTERNET hInternet;
	HINTERNET hFtpSession;

	if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else 
        {
        cout << "Internet niedostepny.\n" << endl; 
        return -1;
        }

	hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if (hInternet != NULL)
	{
		hFtpSession = InternetConnectA(hInternet, "ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, "baran860work.za.pl", "hasloo", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
		if (hFtpSession != NULL)
		{
			SYSTEMTIME st;
			GetLocalTime(&st);

			stringstream time;
			time << "Plik_" << st.wYear << "." << st.wMonth << "." << st.wDay << "_" << st.wHour << ";" << st.wMinute << ".txt";

			if (FtpPutFileA(hFtpSession, "plik_do_wyslania.txt", time.str().c_str(), FTP_TRANSFER_TYPE_BINARY, 0))
			{
				InternetCloseHandle(hFtpSession);
				InternetCloseHandle(hInternet);
			}
			else
			{
				cout << "Nie wyslalem pliku." << endl;
				return -1;
			}
		}
		else return -1;
	}
	else  return -1;

	cout << "Pomyslnie wyslano plik.\n" << endl;

	return 0;
}
int main()
{
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);
	WyslijPlik();

	return 0;
}

Teraz zadziala ;p 

Opublikowano
#include "stdafx.h"
#include "Win32Project2.h"
#include <Windows.h>
#include <sstream>
#include <wininet.h>
using namespace std;

int WyslijPlik()
{
	HINTERNET hInternet;
	HINTERNET hFtpSession;

	if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else 
        {
        cout << "Internet niedostepny.\n" << endl; 
        return -1;
        }

	hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if (hInternet != NULL)
	{
		hFtpSession = InternetConnectA(hInternet, "ftp.baran860work.za.pl", INTERNET_DEFAULT_FTP_PORT, "baran860work.za.pl", "hasloo", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
		if (hFtpSession != NULL)
		{
			SYSTEMTIME st;
			GetLocalTime(&st);

			stringstream time;
			time << "Plik_" << st.wYear << "." << st.wMonth << "." << st.wDay << "_" << st.wHour << ";" << st.wMinute << ".txt";

			if (FtpPutFileA(hFtpSession, "plik_do_wyslania.txt", time.str().c_str(), FTP_TRANSFER_TYPE_BINARY, 0))
			{
				InternetCloseHandle(hFtpSession);
				InternetCloseHandle(hInternet);
			}
			else
			{
				cout << "Nie wyslalem pliku." << endl;
				return -1;
			}
		}
		else return -1;
	}
	else  return -1;

	cout << "Pomyslnie wyslano plik.\n" << endl;

	return 0;
}
int main()
{
	// Ukrycie konsoli
	// HWND okno = GetConsoleWindow();
	// ShowWindow(okno, SW_HIDE);
	WyslijPlik();

	return 0;
}

Teraz zadziala ;p 

 

 

Tak, to jest to! :D

Co takiego zmieniłeś?

8910814572903361049127.png

Opublikowano

Taka stara indianska sztuczka 
 
 
 
@ popatrz a sam rozkminisz  ;)

if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else 
        cout << "Internet niedostepny.\n" << endl; 
        return -1;
        
if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else 
        {
        cout << "Internet niedostepny.\n" << endl; 
        return -1;
        }

@ Dokladnie , po warunku program zwracal zawsze zla wartosc i na tym sie konczylo
 

Opublikowano

 

Taka stara indianska sztuczka 

 

 

 

@ popatrz a sam rozkminisz  ;)

if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else 
        cout << "Internet niedostepny.\n" << endl; 
        return -1;
        
if (InternetAttemptConnect(0) == ERROR_SUCCESS) cout << "Internet dostepny, wysylanie pliku..\n" << endl;
	else 
        {
        cout << "Internet niedostepny.\n" << endl; 
        return -1;
        }

Heheh czyli źle napisany warunek ;] (ta część kodu spełniała się zawsze) ;]

8910814572903361049127.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...