PDA

Visualizza versione completa : [C] Non scrive sul file


Alhazred
12-07-2007, 18.59.15
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?

#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);
}

Semi.genius
12-07-2007, 19.14.32
ehm... fprintf si usa così
fprintf(uscita,"%s",buffer);
ti mancava il formato

Alhazred
12-07-2007, 19.22.13
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.

Semi.genius
12-07-2007, 19.24.14
Scrivi dopo la fprintf
perror("Errore nella scrittura: ");

così vediamo che errore dà la funzione

Alhazred
12-07-2007, 19.26.01
Errore nella scrittura: : No error

Semi.genius
12-07-2007, 19.27.39
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

Alhazred
12-07-2007, 19.32.53
Tutto come prima.

Semi.genius
12-07-2007, 19.36.24
Se mi dai un attimo, lo provo :p

Alhazred
12-07-2007, 19.41.18
Questo è il codice del client, magari può tornare utile:

#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);
}

Semi.genius
12-07-2007, 19.41.59
Thanks..faccio in fretta e spero di risolvere

Alhazred
12-07-2007, 19.44.20
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 :p:D:D:D

Semi.genius
12-07-2007, 21.12.32
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 :p

Alhazred
13-07-2007, 08.35.22
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 :(

LoryOne
13-07-2007, 11.18.52
Mmmm, a me non piace quell' fopen all'interno del ciclo infinito

Semi.genius
13-07-2007, 11.55.35
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

Alhazred
13-07-2007, 14.49.55
Si si, l'ho spostato anch'io l'fopen, ma continua a non scrivere il file, ho provato anche l'attributo "a" invece di "w" ed ho aggiunto l'fclose... niente da fare :(

Alhazred
13-07-2007, 19.53.06
Cambiando "w" oppure "a" con "a+" il file viene scritto correttamente.

Semi.genius
13-07-2007, 19.55.43
Cambiando "w" oppure "a" con "a+" il file viene scritto correttamente.

bella :D anche se non ho capito il perché così funzia :mm:

Alhazred
13-07-2007, 20.45.22
Finché stava dentro il ciclo era perché "w" ed "a" resettano il file ogni volta, mentre "a+" aggiunge alla fine del file senza cancellare quello che c'è prima... ma dopo che ho portato fuori la fopen... boh!