2015-05-27 2 views
1

Когда я запускаю свою программу на linux в uni, программа отлично работает. Создается файл fred.out. Но когда я запускаю его дома на Dev-C++, он не пишет выходной файл.Dev-C++ не пишет выходной файл на диск

Как исправить это? Я искал и пытался в течение нескольких часов. Я попытался включить несколько библиотек. Может ли это быть проблемой безопасности?

Вот мой код:

#include <stdio.h> 

int main(void) 
{ 
    FILE *fp_1; 
    float mat[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
    int i,j; 

    fp_1 = fopen("fred.out","w"); 
    for (j=0;j<3;j++) 
    { 
     for (i=0;i<3;i++) 
      fprintf(fp_1," %+10.2f\n",mat[j][i]); 
     fprintf(fp_1,"\n"); 
    } 
    fclose(fp_1); 

    getch(); 
    return 0; 
} 

EDIT:

after entering a fopen() check

+0

Я отредактировал свой ответ, чтобы опубликовать пример того, как проверить errno. – Bertrand125

ответ

1

Всегда проверяйте успех fopen() перед использованием возвращенного указателя. В противном случае, если fopen() не удается (открыть файл), с помощью возвращенного FILE * далее будет undefined behaviour.

Кроме того, при ошибке fopen() вы можете проверить errno, чтобы решить возникший из-за отказа резонанс.

+0

Спасибо! Я добавил эту проверку fopen(), и она не удалась. что мне делать? –

+0

@ThomasM Я сказал ... проверить 'errno' за резонанс за неудачей. –

+0

как я могу проверить errno? –

0

В Windows и MinGW, возможно, потребуется открыть файл в двоичном режиме, добавляя «Ъ» в FOPEN режиме:

fp_1 = fopen("fred.out","wb"); 

Edit2: Как сказал Degustaf в комментариях, вы можете использовать char * strerror(int errnum), в том числе errno.h и string.h, чтобы знать, что была ошибка:

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

int main(void) 
{ 
    FILE *fp_1; 
    float mat[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
    int i,j; 

    fp_1 = fopen("fred.out","w"); 
    if(fp_1 == NULL) { 
     printf("\n%s",strerror(errno)); 
     return 1; 
    } 

    for (j=0;j<3;j++) 
    { 
     for (i=0;i<3;i++) 
      fprintf(fp_1," %+10.2f\n",mat[j][i]); 
     fprintf(fp_1,"\n"); 
    } 
    fclose(fp_1); 

    getch(); 
    return 0; 
} 

Edit: Вы можете проверить Errno следующим образом, в том числе errno.h, и проверки переменной с именем «ERRNO». В следующем примере, есть некоторые ошибки нет в списке, потому что Еореп может установить ERRNO к тем же ошибки, чем таНос см человеко страницы FOPEN, открытого, и таНоса для получения более подробной информации:

#include <stdio.h> 
#include <errno.h> 

void func_errno() { 

    switch(errno) { 

    case EACCES: printf("\nEACCES"); break; 
    case EEXIST: printf("\nEEXIST"); break; 
    case EFAULT: printf("\nEFAULT"); break; 
    case EFBIG: printf("\nEFBIG"); break; 
    case EINTR: printf("\nEINTR"); break; 
    case EISDIR: printf("\nEISDIR"); break; 
    case ELOOP: printf("\nELOOP"); break; 
    case EMFILE: printf("\nEMFILE"); break; 
    case ENAMETOOLONG: printf("\nENAMETOOLONG"); break; 
    case ENFILE: printf("\nENFILE"); break; 
    case ENODEV: printf("\nENODEV"); break; 
    case ENOENT: printf("\nENOENT"); break; 
    case ENOMEM: printf("\nENOMEM"); break; 
    case ENOSPC: printf("\nENOSPC"); break; 
    case ENOTDIR: printf("\nENOTDIR"); break; 
    case ENXIO: printf("\nENXIO"); break; 
    case EOVERFLOW: printf("\nEOVERFLOW"); break; 
    case EPERM: printf("\nEPERM"); break; 
    case EROFS: printf("\nEROFS"); break; 
    case EWOULDBLOCK: printf("\nEWOULDBLOCK"); break; 
    default: printf("\nOther error."); break; 
    } 
} 


int main(void) 
{ 
    FILE *fp_1; 
    float mat[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
    int i,j; 

    fp_1 = fopen("fred.out","w"); 
    if(fp_1 == NULL) { 
     func_errno(); 
     return 1; 
    } 

    for (j=0;j<3;j++) 
    { 
     for (i=0;i<3;i++) 
      fprintf(fp_1," %+10.2f\n",mat[j][i]); 
     fprintf(fp_1,"\n"); 
    } 
    fclose(fp_1); 

    getch(); 
    return 0; 
} 
+0

заменить "wb" на "w" не изменил результат, поблагодарил за вашу помощь хотя =) –

+0

'func_errno' - это плохая повторная реализация уже доступной функции, [strerror] (http: //pubs.opengroup. орг/onlinepubs/9699919799 /). – Degustaf

0

Я не уверен, что было не так, но я скопировал файлы с моего большого пальца на мой жесткий диск, и у него не было проблем с записью файлов. Спасибо всем за ответы!