2017-07-16 15 views
0

このプログラムは3つ以上の空のファイルを作成しません。ファイル処理プログラムは2つ以上のファイルを作成できません

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

int create(char filename[]) 
{ 
    char filext[10+1]="."; 
    printf("\nEnter File Extension :"); 
    scanf("%9s",filext+1); 
     FILE* fp; 
     strcat(filename, filext); 
     fp = fopen(filename,"w"); 
     if(!fp) 
     { 
      return 0; 
     } 
     fclose(fp); 
     return 1; 

} 
int main(int argc , char* argv[]) 
{ 
    int f; 
    int i; 
    char* j; 
    char buffer[33]; 
    char filename[100]; 
    if (argc == 3) 
    { 
     for(i = 0; i < atoi(argv[2]) ; i++) 
     { 
      j = itoa(i,buffer,10); 
      strcpy(filename,strcat(argv[1],j)); 
      f = create(filename); 
      if(f==0) 
      { 
       printf("error in creating files . check uac!!!"); 
      } 
      else{ 
       printf("\nfile Created ...\n"); 
      } 
     } 
    } 
    else{ 
     printf("syntax Error"); 
    } 
    return 0; 
} 

私はファイルをexcuteしようとすると、次の出力が表示されます。

F:\selfcreatedtools\filegen>gcc gen.c 

F:\selfcreatedtools\filegen>a wander 4 

Enter File Extension :php 

file Created ... 

Enter File Extension :mag 

file Created ... 

F:\selfcreatedtools\filegen> 

私はコマンドラインでargv[2] = 4を渡します。プログラムのループに応じて4回反復する必要があります。出力として4つのファイルを提供します。私のプログラムは2つのファイルを生成し、ループはそれ以降の繰り返しを停止します。

解決策に感謝します。私は初心者です。

+0

'scanf("%9s "、filext + 1);'?なぜ '+ 1'ですか? –

+2

安全にstrcat(argv [1]、j)を実行することはできません。代わりに自分のバッファを割り当てます。 – jarmod

+2

@DavidBowling最初の文字がピリオド・マークになります。 '' char filext [10 + 1] = "。" ";" –

答えて

1

拡張機能のプロンプトを表示しないソリューションです。コマンドラインで提供できます。私のエラー報告機能は、stderr.cstderr.hからhttps://github.com/jleffler/soq/tree/master/src/libsoqまでです。

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

static int create(const char *base, int numlen, int number, const char *dot, const char *extn) 
{ 
    int rc = 0; 
    char filename[1024]; 
    snprintf(filename, sizeof(filename), "%s%.*d%s%s", base, numlen, number, dot, extn); 
    FILE *fp = fopen(filename, "w"); 
    if (fp == 0) 
    { 
     err_sysrem("failed to create file '%s': ", filename); 
     rc = -1; 
    } 
    else 
     fclose(fp); 
    return rc; 
} 

int main(int argc, char **argv) 
{ 
    err_setarg0(argv[0]); 
    if (argc < 3 || argc > 4) 
     err_usage("base number [ext]"); 
    char *base = argv[1]; 
    int number = atoi(argv[2]); 
    const char *dot = "."; 
    char *extn = argv[3]; 
    if (extn == 0) 
    { 
     dot = ""; 
     extn = ""; 
    } 
    if (*extn == '.') 
     dot = ""; 
    char buffer[32]; 
    int numlen = snprintf(buffer, sizeof(buffer), "%d", number - 1); 
    int rc = EXIT_SUCCESS; 
    for (int i = 0; i < number; i++) 
    { 
     if (create(base, numlen, i, dot, extn) != 0) 
      rc = EXIT_FAILURE; 
    } 
    return rc; 
} 

文字列の連結を管理するためにsnprintf()を使用します。

例は、(プログラムがgen29と呼ばれていました)を実行します:

$ gen29 base 10 
created: [base0] 
created: [base1] 
created: [base2] 
created: [base3] 
created: [base4] 
created: [base5] 
created: [base6] 
created: [base7] 
created: [base8] 
created: [base9] 
$ gen29 base 10 .ext 
created: [base0.ext] 
created: [base1.ext] 
created: [base2.ext] 
created: [base3.ext] 
created: [base4.ext] 
created: [base5.ext] 
created: [base6.ext] 
created: [base7.ext] 
created: [base8.ext] 
created: [base9.ext] 
$ gen29 base 13 xtn 
created: [base00.xtn] 
created: [base01.xtn] 
created: [base02.xtn] 
created: [base03.xtn] 
created: [base04.xtn] 
created: [base05.xtn] 
created: [base06.xtn] 
created: [base07.xtn] 
created: [base08.xtn] 
created: [base09.xtn] 
created: [base10.xtn] 
created: [base11.xtn] 
created: [base12.xtn] 
$ 

あなたが本当に私のゲストなると修正を行い、ファイルの作成にプロンプ​​トをしたいが、IMOようなプログラムはあまり有用である場合プロンプトを出さないものよりも。

関連する問題