2016-11-26 10 views
-1
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
int main(int argc, char **argv){ 

FILE *fp; 
if((fp=fopen("Example.txt", "r"))== NULL){ 
    printf("Errore apertura file"); 
    exit(0); 
} 
char s[50]; 
int i=0; 
while(!feof(fp)){ 
if(!feof(fp)){ 
s[i++]=fgetc(fp); 
    } 
} 
s[i]='\0'; 
fclose(fp); 
char nome[20]; 
printf("Inserisci il nome che vuoi dare al file di uscita\n"); 
//fgets(nome,20,stdin); 
scanf("%s",& nome); 
char tipo[5]=".txt"; 
strcat(nome,tipo); 
if((fp=fopen(nome,"w"))== NULL){ 
    printf("Errore apertura file"); 
    exit(0); 
} 
fputs(s, fp); 
fclose(fp); 
return 0; 
} 

文字列の出力ファイルにも異常文字が印刷されていますが、どうやって見えませんか? 出力は "string" + "ÿ"です 問題は出力ファイルでのみ発生し、キャプチャでは発生しません。ファイル出力に最後の文字を見たくない

+0

'scanf("%s "、nome);' –

+0

と 'feof'は決して使用しません。常に 'EOF'を手動でチェックしてください。 –

+0

なぜ 'feof()を使用するのかについての議論については、' 'while(!feof(file))'は常に間違っています。](http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) () 'が間違っています。あなたが見ているのは、コードポイント0xFFがU + 00FF、LATIN LOWER CASE LETTER YがDIAERESIS(ÿ)のCP1252やISO 8859-1などのコードセットの通常の動作です。 'fgetc(fp)'の結果を 'char'に代入してはいけません。文字として使用する前に、 'int'値がEOFであるかどうかをチェックする必要があります。 –

答えて

0

ご入力ループは次のようになります。でも、

char s[50]; 
int i=0; 
int c; 
while (i < (50 - 1) && (c = fgetc(fp)) != EOF) 
    s[i++] = c; 
s[i] = '\0'; 

または:

char s[50]; 
int i; 
int c; 
for (i = 0; i < (50 - 1) && (c = fgetc(fp)) != EOF; i++) 
    s[i] = c; 
s[i] = '\0'; 

これらの回避バッファオーバーフローや配列sにEOFを保存しようとしないでください。また、feof()も使用しません。それを使用する必要はめったになく、ループが終了してEOFと読み取りエラーを区別する必要があります(ferror()も参照)。

+0

ありがとう、良いそれは非常にうまく行く、私は数値をdelateしたい場合[50]私はどのようにすることができますか? – Domenico

+0

どの50?最初のものは適切に大きな数に置き換える必要があります。 2番目は 'sizeof(s)'で置き換えることができます。 –

関連する問題