|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5805
|
[C] Problema open file fantasma
Ciao a tutti,
ho un problema davvero singolare con la creazione di files. Sto lavorando sotto Linux. In pratica, apro un file: Codice:
file_desc_out = open(filename, O_CREAT | O_WRONLY, 0666 ); Se digito il comando "file <nome_file>" per sapere il tipo mi dice: Codice:
out_info: cannot open (out_info) ![]() Avete qualche idea? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Ciao,
Bè, se riesci a postare anche il resto del codice è meglio, il problema potrebbe essere nella variabile 'filename' o altro.... inoltre ti consiglio di effettuare i controlli sul valore di "errno" come minimo dove open ritorna con errori.. per utilizzare la variabile errno includi l'header errno.h e dichiara errno extern cosi: Codice:
extern int errno; |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5805
|
Ciao,
l'errno l'ho controllato. Vale 29, ovvero "No such file or directory". Ecco il codice: Codice:
#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <string.h> void open_out_info_file_(int*file_desc_out, const char*filename){ *file_desc_out = open(filename, O_CREAT | O_WRONLY, 0666 ); if(*file_desc_out == -1) { perror("Errore creazione file info di output \n"); printf("errno = %d \n", errno); exit(-1); } } void write_out_info_file_(int*file_desc_out, const int*buffer, const int*num_elems){ int elems_write; elems_write = write(*file_desc_out, &buffer[0], (*num_elems) * sizeof(int)); if( elems_write != (*num_elems) * sizeof(int)) { perror("Errore scrittura file info di output \n"); printf("errno = %d \n", errno); exit(-1); } } void close_out_info_file_(int*file_desc_out){ int ret = close(*file_desc_out); if( ret!=0 ) { perror("Errore chiusura file info di output \n"); printf("errno = %d \n", errno); exit(-1); } } Ultima modifica di Unrue : 11-12-2009 alle 13:55. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Prova correggendo cosi:
Codice:
#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <string.h> void open_out_info_file_(int*file_desc_out, const char*filename){ *file_desc_out = open(filename, O_CREAT | O_WRONLY, 0666 ); if(*file_desc_out == -1) { perror("Errore creazione file info di output \n"); printf("errno = %d \n", errno); exit(-1); } } void write_out_info_file_(int*file_desc_out, const int*buffer, const int num_elems){ int elems_write; elems_write = write(*file_desc_out, &buffer[0], sizeof(int)); if( elems_write != sizeof(int)) { perror("Errore scrittura file info di output \n"); printf("errno = %d \n", errno); exit(-1); } } void close_out_info_file_(int*file_desc_out){ int ret = close(*file_desc_out); if( ret!=0 ) { perror("Errore chiusura file info di output \n"); printf("errno = %d \n", errno); exit(-1); } } |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5805
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
capisco... non so nulla di fortran... però hai provato ad indagare con un debugger? tipo ddd che è una interfaccia per gdb...
Dovresti riuscire a capire ciò che accade. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5805
|
Ho capito il problema. In pratica, passando una stringa da Fortran a C si deve prestare attenzione a quando finisce realmente la stringa lato C. Se passo una stringa di 100 elementi, ma ne contiene solo 20, senza alcun controllo creo un file di nome stringa + 80 spazi.
Infatti il file c'era, ma non vedendo gli spazi pensavo che il nome fosse quello. Una gestione aberrante delle stringhe in Fortran, eh va bè, è vecchiotto e si vede ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:06.