2017-09-17 5 views
-1

私はCを使用して、フォルダ内のファイルを削除しようとしているが、それは私にいくつかの戻り値Cは - フォルダwirh削除()

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

int main() 
{ 
    FILE *fp1; 
    char str[100]; 
    gets(str); 
    strcat(str,"txt"); 

    fp1 = fopen(str,"r"); 
    fclose(fp1); 

    remove(str); 

    return 0; 
} 

これを投げ&をクラッシュの作業されていないで、ファイルを削除できません。私はWindows XP SP2(32ビット)を使用していて、Cプログラムでsystem()コマンドを試してみましたが、助けてください。誰でもこの問題を解決するのを手伝ってもらえますか?

+0

strcat use strcat(str、 "。txt");追加します。 –

+5

決して、決して、 'gets'を使用しないでください。それは安全ではなく、その事実のためにC11ライブラリから削除されました。 'fgets'を使い、最後から' '\ n' 'をトリミングしてください。あなたの教授があなたが 'gets 'を使いたいと思ったら、クラスを今すぐ落として別の教授を探しに行ってください... –

+3

チェックされていない' fopen'と 'fclose'のペアの意味を見つけることは困難です。 – WhozCraig

答えて

0

fopenに電話する理由は不明ですが、あなたはそれから何も読んでいません。あなたがファイルの存在のチェックとしてそれを使用しようとしている場合、必要はありません。removeからの返信は、削除が成功したかどうかを教えてくれます。

は、たとえば、次のような何かを行うことができ:

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

#define EXT ".txt" 

#ifndef PATH_MAX 
#define PATH_MAX 4096 
#endif 

int main (void) { 

    char buf[PATH_MAX] = ""; 
    size_t len = 0; 

    printf ("enter filename to delete (without .txt); "); 
    if (!fgets (buf, sizeof buf, stdin) || *buf == '\n') { 
     fprintf (stderr, "error: EOF or invalid input.\n"); 
     return 1; 
    } 

    len = strlen (buf);   /* get length */ 
    if (buf[len - 1] == '\n') /* check trailing '\n' */ 
     buf[--len] = 0;   /* overwrite with '\0' */ 
    else { 
     /* handle error, input exceeded buf size */ 
     return 1; 
    } 

    strcat (buf, EXT); 

    errno = 0; 
    if (remove (buf) == -1) 
     perror ("remove failed"); 
    else 
     printf ("file: '%s' successfully removed.\n", buf); 

    return 0; 
} 

使用例/出力それはLinuxまたはDOS上で同じ働き

$ ls -al foobar.txt 
-rw-r--r-- 1 david david 0 Sep 17 06:35 foobar.txt 

$ ./bin/rmfile 
enter filename to delete (without .txt); foobar 
file: 'foobar.txt' successfully removed. 

$ ./bin/rmfile 
enter filename to delete (without .txt); foobar 
remove failed: No such file or directory 

(あなただけPATH_MAXを定義する必要があります窓に)。

使用例/出力のWindows

c:\Users\david\Documents\dev\src-c\tmp>cl /Wall /Ox /Febin\rmfile rmfile.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

rmfile.c 
Microsoft (R) Incremental Linker Version 10.00.30319.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:bin\rmfile.exe 
rmfile.obj 

c:\Users\david\Documents\dev\src-c\tmp>echo "test on Windoze" > foobar.txt 

c:\Users\david\Documents\dev\src-c\tmp>dir foobar.txt 
Volume in drive C has no label. 
Volume Serial Number is 2045-D579 

Directory of c:\Users\david\Documents\dev\src-c\tmp 

09/17/2017 06:56 AM    20 foobar.txt 
      1 File(s)    20 bytes 
      0 Dir(s) 20,235,399,168 bytes free 

c:\Users\david\Documents\dev\src-c\tmp>bin\rmfile 
enter filename to delete (without .txt); foobar 
file: 'foobar.txt' successfully removed. 

c:\Users\david\Documents\dev\src-c\tmp>bin\rmfile 
enter filename to delete (without .txt); foobar 
remove failed: No such file or directory 

私はあなたが窓の上にある場合、あなたはおそらく、コンパイラからstrcat警告を削除するには、ファイルの先頭に次のように定義する必要がありますね。

#if defined (_WIN32) || defined (_WIN64) 
#define _CRT_SECURE_NO_WARNINGS 
#endif 
関連する問題