PDA

Visualizza la versione completa : [C] Errori nell'uso delle funzioni creat() e fputs()


Daisyland
15-03-2011, 14:49
Non utilizzo il C da tempo.
Stavo facendo un programma in cui leggo il contenuto di un file, chiamiamolo file.txt, poi creo un altro file, nuovo_file.txt e metto dentro il contenuto del primo file nel secondo.
Non capisco perche' mi da' warning nella funzione creat (e' sbagliata ?), dove mi dice:
[Warning] assignment makes pointer from integer without a cast
E mi da' errori sulla fputs, quando provo a scrivere nel secondo file la stringa letta nel primo


#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *strcat(char *str1, const char *str2);

main()
{
FILE *fp, *fp1;
char ch, filename[40], mode[4];

char stringa[80];
int n;
int *ip;
char *str;
char *nuovo_file;

char nuovo[7] = "nuovo_";

while(1)
{
/* Legge il nome del file e il modo */
printf("\nInserire il nome del file: ");
gets(filename);


printf("filename = %s\n", filename);
/* Apertura del file */
if((fp = fopen(filename, "r")) != NULL)
{

int i;

nuovo_file = strcat(nuovo, filename);
fp1 = creat(nuovo_file, "w");

while(!feof(fp)){
fgets(stringa, 100, fp);
fputs(stringa, fp1);
}
fclose(fp);
fclose(fp1);
puts("Premere x per uscire, un altro tasto per proseguire.");
if((ch = getc(stdin)) == 'x')
break;
else
continue;
}
else
{
fprintf(stderr, "\nErrore apertura file %s in modo %s.\n", filename, mode);
puts("Premere x per uscire, un altro tasto per ritentare.");
if((ch = getc(stdin)) == 'x')
break;
else
continue;
}
}

system("PAUSE");
}

Daisyland
15-03-2011, 14:54
Aggiungo che nel caso della fputs qui non ho messo la parte in cui alloco memoria nel file, ogni volta che inserisco la stringa estratta dal primo, quindi non credo sia li'l'errore (errore che non so di che tipo sia)

MItaly
15-03-2011, 15:09
creat una funzione POSIX per la gestione dei file, che restituisce un descrittore file come int (che tu cerchi di assegnare ad un FILE *, da cui l'errore); la fputs, invece, una funzione della libreria C, che lavora con degli handle di file "opachi" (FILE *).
Sono due categorie di funzioni completamente separate, non le devi mischiare; personalmente ti consiglio di usare solo le funzioni della libreria C, cercando di usare quelle POSIX solo se ne hai bisogno.
Per aprire un file con le funzioni della libreria C la funzione corretta da usare la fopen. Trovi le altre funzioni di stdio.h ad esempio qui (http://www.cplusplus.com/reference/clibrary/cstdio/).

Daisyland
16-03-2011, 00:31
Perfetto, grazie, in effetti mettendo fopen per creare il file (non mi ricordavo proprio che lo creasse, credevo solo che aprisse un file gia' esistente), funziona anche fputs.

YuYevon
16-03-2011, 10:32
Tra l'altro il ricorso alla creat(), anche quando si voglia/debba effettivamente ricorrere alla gestione dei file con le funzioni POSIX, "ridondante": la creat() stata introdotta in passato quanto la funzione open() permetteva solo di aprire file gi esistenti senza consentire di crearne di nuovi. Oggi invece, grazie agli opportuni flags, creat(path, mode) del tutto equivalente a



open(path, O_CREAT| O_WRONLY| O_TRUNC, mode);


quindi ricorrere a creat() praticamente inutile.

Loading