Telefonino.net network
 
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. NEI PREFERITI .:: | RSS Forum | RSS News | NEWS web | NEWS software |
| PUBBLICITA' | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | CERCA nel FORUM » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 12-07-2007, 18.59.15   #1
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
[C] Non scrive sul file

Sto scrivendo un'applicazione Client-Server.
Ho questo problema, il processo client passa al server una stringa, la stringa arriva perché la printf la stampa sulla console, ma non riesco a farla scrivere su un file. Il file viene creato, ma resta vuoto.
Cosa mi sfugge?
Codice:
#include <windows.h>
#include <stdio.h>

#define ErroreIO               -1

int main(int argc,char **argv)
{
	HANDLE		handle;
	LPCTSTR		errMsg, FileDaScrivere = "output.txt";
    FILE        *uscita;


	/* Crea il mailslot */
	handle = CreateMailslot("\\\\.\\mailslot\\blort",
							0,
							MAILSLOT_WAIT_FOREVER,
							NULL);
	if (handle == INVALID_HANDLE_VALUE) 
	{
		TCHAR	strError[256];

		errMsg = "CreateMailslot ha fallito: %s";
print_err:
		// Prende il messaggio d'errore da Windows associato al numero d'errore
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &strError[0], 256, 0);

		// Visualizza l'errore
		printf(errMsg, &strError[0]);

		// Chiude i mailslot aperti
		if (handle != INVALID_HANDLE_VALUE) CloseHandle(handle);

		return(-1);
	}

	while(1)
	{
		DWORD	msgSize;
		BOOL	err;

        uscita = fopen(FileDaScrivere,"w");
        if(uscita == NULL)
            return ErroreIO;


		/* Prende la dimensione del prossimo record */
		err = GetMailslotInfo(handle, 0, &msgSize, 0, 0);

		/* Controlla se c'è un errore */
		if (!err)
		{
			errMsg = "GetMailslotInfo failed: %s";
			goto print_err;
		}
			
		/* Controllo se msgSize è nullo */
		if (msgSize != (DWORD)MAILSLOT_NO_MESSAGE)
		{
			void *	buffer;

			/* Allocazione di memoria */
			buffer = GlobalAlloc(GMEM_FIXED, msgSize);
			if (!buffer) printf("Errore allocazione del blocco di memoria!");
			else
			{
				DWORD	numRead;

				/* legge il record */
				err = ReadFile(handle, buffer, msgSize, &numRead, 0);

				/* Controlla se c'è un errore */
				if (!err) printf("ReadFile error: %d", GetLastError());

				/* Mi assicuro di aver letto tutti i bytes */
				else if (msgSize != numRead) printf("ReadFile non ha letto il giusto numero di bytes!");

				else
				{
                                       /***********************************
                                        ***********************************
                                        Qui sotto le stampe su console e su file
                                       ***********************************
                                       ***********************************/

					// bufer contiene la stringa
                                        printf(buffer); //scrive sulla console il contenuto del buffer
					fprintf(uscita,buffer); //non scrive sul file
				}

				/* Libero il buffer */
				GlobalFree(buffer);
			}
		}

		/* pausa */
		Sleep(1000);
	}

	return(0);
}
Alhazred non è collegato   Rispondi citando
Vecchio 12-07-2007, 19.14.32   #2
Semi.genius
Guest
 
Messaggi: n/a
ehm... fprintf si usa così
fprintf(uscita,"%s",buffer);
ti mancava il formato
  Rispondi citando
Vecchio 12-07-2007, 19.22.13   #3
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
La fprintf l'ho usata con il formato fprintf(uscita,buffer); su un codice di prova e funziona a dovere, scrive sul file.
Ho comunque modificato il codice come mi hai suggerito... continua a non scrivere sul file.
Alhazred non è collegato   Rispondi citando
Vecchio 12-07-2007, 19.24.14   #4
Semi.genius
Guest
 
Messaggi: n/a
Scrivi dopo la fprintf
perror("Errore nella scrittura: ");

così vediamo che errore dà la funzione
  Rispondi citando
Vecchio 12-07-2007, 19.26.01   #5
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Errore nella scrittura: : No error
Alhazred non è collegato   Rispondi citando
Vecchio 12-07-2007, 19.27.39   #6
Semi.genius
Guest
 
Messaggi: n/a
Quota:
Inviato da Alhazred
Errore nella scrittura: : No error

Quindi è convinta di scrivere e va a buon fine....

prova a fare dopo della fprintf:

fflush(uscita);

così se ci sono dei dati sul buffer di sistema, siamo sicuri che li scrive

Ultima modifica di Semi.genius : 12-07-2007 alle ore 19.29.28 Motivo: ho scritto prima invece è dopo:p
  Rispondi citando
Vecchio 12-07-2007, 19.32.53   #7
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Tutto come prima.
Alhazred non è collegato   Rispondi citando
Vecchio 12-07-2007, 19.36.24   #8
Semi.genius
Guest
 
Messaggi: n/a
Se mi dai un attimo, lo provo
  Rispondi citando
Vecchio 12-07-2007, 19.41.18   #9
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Questo è il codice del client, magari può tornare utile:
Codice:
#include <windows.h>
#include <stdio.h>


int main(int argc,char **argv)
{
	HANDLE		handle;
	LPCTSTR		errMsg;
	BOOL	    err;
	DWORD		numWritten;
	static TCHAR MyMessage[] = {"Testo di prova\r\n"};

	/* Attacca il mailslot aperto dal server */
	handle = CreateFile("\\\\*\\mailslot\\blort",
						GENERIC_WRITE, 
						FILE_SHARE_READ,
						0, 
						OPEN_EXISTING, 
						FILE_ATTRIBUTE_NORMAL, 
						0); 
	if (handle == INVALID_HANDLE_VALUE) 
	{
		TCHAR	strError[256];

		errMsg = "CreateFile ha fallito: %s";
print_err:
		// Prende il messaggio d'errore da Windows associato al numero d'errore Windows
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &strError[0], 256, 0);

		// Visualizza il messaggio
		printf(errMsg, &strError[0]);

		// Chiude i mailslot aperti
		if (handle != INVALID_HANDLE_VALUE) CloseHandle(handle);

		return(-1);
	}

	/* Scrive il messaggio nel mailslot */
	err = WriteFile(handle, MyMessage, sizeof(MyMessage), &numWritten, 0);

	/* Controlla se c'è un errore */
	if (!err)
	{
		errMsg = "WriteFile ha fallito: %s";
		goto print_err;
	}

	/* Controlla che tutti i bytes siano stati scritti */
	if (sizeof(MyMessage) != numWritten) printf("WriteFile non ha scritto il numero esatto di bytes!\n");

	return(0);
}
Alhazred non è collegato   Rispondi citando
Vecchio 12-07-2007, 19.41.59   #10
Semi.genius
Guest
 
Messaggi: n/a
Thanks..faccio in fretta e spero di risolvere
  Rispondi citando
Vecchio 12-07-2007, 19.44.20   #11
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Fra poco dovrò uscire, se non rispondo sarà per quello.
Grazie per l'aiuto...
se invece di Semi.genius fossi stato genius però avremmo già risolto
Alhazred non è collegato   Rispondi citando
Vecchio 12-07-2007, 21.12.32   #12
Semi.genius
Guest
 
Messaggi: n/a
Non riesco a venirne a capo...

uhm.. mi sta salendo un dubbio..perché appena chiuso il programma il file viene scritto....

che windows usi? io sto usando Vista e so che lì hanno introdotto il I/O I/O Prioritization..lo devo provare su XP questo programma

sto sparando grosso comunque visto che non riesco a capire
  Rispondi citando
Vecchio 13-07-2007, 08.35.22   #13
Alhazred
Made in Japan
Top Poster
 
L'avatar di Alhazred
 
Registrato: 04-07-2001
Messaggi: 4.461
Alhazred promette bene
Io uso XP, quindi non penso sia questo il problema.
Sembra davvero una cosa strana questa che succede... provo a perderci un altro po' di tempo
Alhazred non è collegato   Rispondi citando
Vecchio 13-07-2007, 11.18.52   #14
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
Mmmm, a me non piace quell' fopen all'interno del ciclo infinito
LoryOne non è collegato   Rispondi citando
Vecchio 13-07-2007, 11.55.35   #15
Semi.genius
Guest
 
Messaggi: n/a
Quota:
Inviato da LoryOne
Mmmm, a me non piace quell' fopen all'interno del ciclo infinito
Già..l'ho tolta io mettendola prima del ciclo, ma anche se uso fflush non scrive immediatamente sul file
  Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Conversazione con Doretta NightMan Chiacchiere in libertà 42 08-12-2007 12.00.31
HELP - Dato un file txt con dei nomi ogni rigo, come fare a copiare un certo file, ri Cavallaudo Windows 7/Vista/XP/ 2003 0 18-08-2007 19.16.41
Imaging e Win Xp Cico2000 Windows 7/Vista/XP/ 2003 6 15-04-2005 19.01.01

Orario GMT +2. Ora sono le: 17.19.42.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.