2015-06-30 5 views
-1

Приведенный ниже код работает отлично, если я закомментировать Sprintf линию в самом низуКак исправить ошибку Sprintf

int doStepOneAndTwo(){ 
FILE *fp, *source, *target, *fp1; 
    PROT prot; 
    int i, j; 
    int k, counter; 
    int n_conf; 
    int number_of_dir; 
    int number_of_line; 
    char sbuff[256]; 
    char str[256]; 
    char str1[256]; 
    int ch; 
    const char *a[5]; 

    number_of_line = 140; 
    number_of_dir = ceil(number_of_line /30) + 1; 
    a[0] = "submit.sh"; 
    a[1] = FN_RUNPRM; // run.prm 
    a[2] = env.rename_rules; // name.txt 
    a[3] = env.inpdb; // prot.pdb 
    a[4] = STEP2_OUT; // step2_out.pdb 

    for (i=1; i<=number_of_dir; i++) 
    { 

     sprintf(str,"_%d", i); 
     mkdir(str,"0755"); // Create temporary directories 

     for (j=0;j<5;j++) 
     { 
      sprintf(str,"%s", a[j]); 
      source = fopen(str, "r"); 
      if(source == NULL) 
      { 
       printf("Error in doStepOneAndTwo, can't open file source \n"); 
       return USERERR; 
      } 
      sprintf(str,"_%d/%s", i, a[j]); 
      target = fopen(str, "w"); 
      if(target == NULL) 
      { 
       fclose(source); 
       printf("Error in doStepOneAndTwo, can't open file target %s \n",str); 
       return USERERR; 
      } 


      while((ch = fgetc(source)) != EOF) { 
       fputc(ch, target); 
      } 

      //if(k!=1){printf("foo");}else{printf("bar \n");} 
      //k++; 

     } 

    } 
    fclose(source); 
    fclose(target); 

for (k=1; k<2; k++) 
    { 
     printf("Yes %d \n",k); 

     sprintf(str1,"_%d/run.prm",k); // If I comment this line everything works just fine 
     //chdir("_1"); 
     fp1=fopen(FN_RUNPRM, "r"); 
    } 

return 0; 

} 

Ошибка я получаю «Ошибка в doStepOneAndTwo, не может открыть целевой файл _1/отправить .sh ". В основном, целевой файл NULL. Я новичок в c и не знаю, что я делаю неправильно.

+0

Вы используете это в том же каталоге, что и 'submit.sh'? Если нет, то вам нужно указать полный путь к файлу 'submit.sh'. –

+0

Ожидаете ли вы, что этот файл существует, или собираетесь его создать? fopen создаст файл, если он есть, но не каталог. –

+0

submit.sh существует в одном каталоге, и я копирую его в другой каталог. Все выполняется, если я прокомментирую строку sprintf в последнем цикле. Я не понимаю, почему первый цикл влияет на последний цикл. –

ответ

2

Мне очень сложно поверить, что комментирование sprintf() заставляет программу работать на вас. Это не помогает мне.

Основная проблема заключается в вашем вызове mkdir(). Режим файла, переданный в этот syscall, должен быть целым (в частности, mode_t), но вы передаете указатель, преобразованный в целое число. Это вовсе не означает, что вы намерены. В моем конкретном случае результирующий режим каталога не позволял владельцу писать права на запись, в результате чего вы точно описали сообщение об ошибке.

Этого альтернативный mkdir() вызов делает вашу работу программы для меня, независимо от того, является ли sprintf() в конце котируются:

mkdir(str, 0755); 

Обратите внимание, что неупомянут0755 является восьмеричного (основание 8) буквально, начиная с цифры 0 и не являясь шестнадцатеричным литералом. Было бы более обычным писать это так, хотя:

mkdir(str, S_IRWXU | S_IRGRP | SIXGRP | S_IROTH | S_IXOTH); 

Вы, возможно, потребуется включить один или несколько sys/types.h, sys/stat.h и fcntl.h, чтобы получить определения для макрокоманд режима.

+0

Да, это исправлено, не считая 0755 в mkdir(). –

Смежные вопросы