2013-09-28 5 views
1

파일 포인터 배열을 만들었고 코어 덤프를 받았습니다. 모든 것을 하나의 파일에 쓰면 프로그램이 정상적으로 작동합니다. 이것에 대한 이유는 무엇입니까?C 프로그램 (코어 덤프)에서 16 개 파일을 열 수 없습니다.

이것은 작동합니다.

unsigned char error_array[4][4][256] 
FILE *hypo_table; 
hypo_table = fopen("00.txt", "w"); 
for(i = 0; i < 4; i++) { 
    for(j = 0; j < 4; j++) { 
     for(hypo_key = 0; hypo_key < 256; hypo_key++) { 
      //process error_array 
      fprintf(hypo_table, "%.2x ", error_array[i][j][hypo_key]); 
      if(hypo_key == 255) 
       break; 

이것은 작동하지 않습니다 (코어 덤프).

unsigned char error_array[4][4][256] 
FILE *hypo_table[4][4]; 
hypo_table[0][0] = fopen("00.txt", "w"); 
hypo_table[1][0] = fopen("10.txt", "w"); 
hypo_table[2][0] = fopen("20.txt", "w"); 
hypo_table[3][0] = fopen("30.txt", "w"); 

hypo_table[1][0] = fopen("10.txt", "w"); 
hypo_table[1][1] = fopen("11.txt", "w"); 
hypo_table[1][2] = fopen("12.txt", "w"); 
hypo_table[1][3] = fopen("13.txt", "w"); 

hypo_table[2][0] = fopen("20.txt", "w"); 
hypo_table[2][1] = fopen("21.txt", "w"); 
hypo_table[2][2] = fopen("22.txt", "w"); 
hypo_table[2][3] = fopen("23.txt", "w"); 

hypo_table[3][0] = fopen("30.txt", "w"); 
hypo_table[3][1] = fopen("31.txt", "w"); 
hypo_table[3][2] = fopen("32.txt", "w"); 
hypo_table[3][3] = fopen("33.txt", "w"); 


for(i = 0; i < 4; i++) { 
    for(j = 0; j < 4; j++) { 
     for(hypo_key = 0; hypo_key < 256; hypo_key++) { 
      //process error_array 
      fprintf(hypo_table[i][j], "%.2x ", error_array[i][j][hypo_key]); 
      if(hypo_key == 255) 
       break; 
+0

어떤 줄에서 실패합니까? –

+0

i = 0, j = 0, hypo_key = 255 – drdot

+0

그럼 error_array [i] [j] [hypo_key]는 어떻게됩니까? – paulsm4

답변

3

당신이하고있는 실수는 루프에서 초기화되지 않은 스트림을 사용하고 있다는 것입니다. 당신은 당신이 어떤 파일을 열어하지 않았다 twice.But 동일한 파일을 여는 당신은 어떤 스트림을 할당하지 않은

여기에 당신은 파일 01.txt, 02.txt03.txt 그리고
hypo_table[0][1],hypo_table[0][2],hypo_table[0][3]이 유효 스트림

이없는 오픈하지 않았다
hypo_table[0][0] = fopen("00.txt", "w"); 

hypo_table[1][0] = fopen("10.txt", "w"); //Here ,it is 01 
hypo_table[2][0] = fopen("20.txt", "w"); //Here ,it is 02 
hypo_table[3][0] = fopen("30.txt", "w"); //Here ,it is 03 

hypo_table[1][0] = fopen("10.txt", "w"); //Here You are reopening 
hypo_table[1][1] = fopen("11.txt", "w"); 
hypo_table[1][2] = fopen("12.txt", "w"); 
hypo_table[1][3] = fopen("13.txt", "w"); 

for(i = 0; i < 4; i++) { 
    for(j = 0; j < 4; j++) { 
     for(hypo_key = 0; hypo_key < 256; hypo_key++) { 
      //process error_array 

여기서 잘못된 스트림에 액세스하려고합니다. 이것은 segfault를 줄 것이다. 파일을 열고 스트림을 할당하고 반환 값을 기준으로 fopen()의 반환 값을 확인하는

  fprintf(hypo_table[i][j], "%.2x ", error_array[i][j][hypo_key]); 

사용 루프는 더 이상 진행.

sprintf()을 사용하여 파일 이름 문자열을 만듭니다.

FILE *hypo_table[4][4],*fp=NULL; 
char buf[10]; 

    for(i = 0; i < 4; i++) { 
     for(j = 0; j < 4; j++) { 
       sprintf(buf,"%d%d.txt",i,j);  
       fp = fopen(buf, "w"); 
       if(fp!=NULL) 
        { 
        hypo_table[i][j] =fp; 
        //You can include inner loop Here 
        fp=NULL; 
        }  
       else 
        { 
        perror("ERROR"); 
        //Handle As you want or simply exit. 
        } 
       } 
      } 
2

fopen이 실패 할 수 있다는 사실을 알아야합니다. 프로세스가 열 수있는 파일의 수에는 상한선이있을 수 있습니다.

fopen이 실패하면 NULL을 반환합니다. 이 NULL 반환하면

, fprintf와 당신이 실패하는 하나의 참조

hypo_table[3][3] = fopen("33.txt", "w"); assert(hypo_table[3][3] != NULL); 

당신이 그들 각각에 대해 거기에 주장 토스 경우

을 것입니다 위반에 액세스합니다. 어설 션 기능을 사용하려면 #include가 필요합니다. 파일을 열 때

는 일반적으로이 패턴의 라인을 따라 뭔가를 따라야합니다

FILE *fp = fopen("some_file.txt", "rw"); 
if (fp != NULL) 
{ 
    /* Do file stuff */ 

    fclose(fp); 
} 
else 
{ 
    printf("golly gee wilkers, the file didn't open\n"); 
    /* and maybe look at the errno variable to figure out why */ 
} 
+0

코멘트 주셔서 감사합니다. hypo_key는 부호없는 char이며, break 조건은 무한 루프를 막는 것입니다. 나는 지금 주장을 시도 할 것이다. – drdot

+0

어설 션이 실패하지 않았습니다 ... – drdot

+0

@dannycrane 두 가지 이유 중 하나 때문에 실패하지 않았습니다. 첫 번째 가능성은 "rw"가 읽기 - 쓰기 모드 AFAIK에서만 Windows에서 열리기 때문에 "rw"가 "r"인 것처럼 열렸습니다. 모든 파일 작성 기능이 실패합니다. 다른 가능성은 코드가 나타내는 것처럼 읽기 - 쓰기 모드로 열렸으며, 기본 모드는 파일 쓰기가 발생할 때까지 읽기 모드입니다. 이것은 파일이 성공적으로 여러 번 열릴 수 있다는 것을 의미합니다. 글쓰기는 또 다른 이야기입니다. 하나의 파일 쓰기가 하나의 'FILE *'을 사용하여 발생하고 다른 하나가 쓰기를 시도한다면 어떤 일이 일어날 지 확신 할 수 없습니다. –

0

1) 동시에 16 개 파일을 열 수 없습니다해야 할 이유가 없습니다.

2) 사용자의 2 차원 배열 hypo_table이 정상적으로 보입니다.

3) 3 일 배열 error_array에 대해 알지 못합니다. 그게 네 문제가 어디 있는지 의심 스럽다.

4) "fopen()"오류와 같은 가능한 모든 오류 조건을 확실히 확인해야합니다. 이 정확히 이 실패 어디에 결정하는 데 도움이됩니다, 그리고 이유 -

5) 당신은 확실히 디버거에서 코드를 단계별로한다.

+0

코멘트 주셔서 감사합니다. 좀 더 자세한 내용을 추가했습니다. – drdot