2012-03-23 4 views
-1

archive()에서 호출하면 readcont(char *filename)이 정상적으로 실행됩니다! runoptions()에서 호출되었지만 "보관 됨"파일을 나열하는 데 실패했습니다! 왜 이런거야?
프로그램은 터미널에서 실행되어야합니다. 사용법을 보려면 매개 변수로 -h을 사용하십시오. 이 프로그램은 텍스트 파일을 ".rldzip"파일로 "보관"하기 위해 작성되었습니다. readcont(char *x) 파일에 보관 파일 (*x)x에서 호출 할 때 함수가 잘 실행되는 이유를 알고 싶습니다.

가) 성공적으로 호출

를 사용하여 프로그램이 3 개 텍스트 파일을 보관하는 표시해야합니다 : rldzip.exe해서 a.txt b.txt c.txt FILEXY이 을 -a를 archive() 것 readcont를 호출하면 바이너리 FILEXY가 생성 된 후 보관 된 파일을 보여 주면서 작동합니다.

b)는 파일을 만든 후 실패 호출

, 사용 : FILEXY.rldzip -v rldzip.exe 당신은 함수 충돌이 있음을 볼 수 있습니다!

왜 그런지 알고 싶습니다.

/* 
    Sa se scrie un program care: 
    a) arhiveaza fisiere 
    b) dezarhiveaza fisierele athivate 
*/ 
#include<stdio.h> 
#include<stdlib.h> 
#include<conio.h> 
#include<string.h> 

struct content{ 
    char *text; 
    char *flname; 
}*arc; 

FILE *f; 

void readcont(char *x){ 
    FILE *p; 

    if((p = fopen(x, "rb")) == NULL){ 
    perror("Critical error: "); 
    exit(EXIT_FAILURE); 
    } 
    content aux; 
    int i; 
    fread(&i, sizeof(int), 1, p); 
    printf("\nFiles in %s \n\n", x); 
    while(i-- >1 && fread(&aux, sizeof(struct content), 1, p) != 0) 
    printf("%s \n", aux.flname);   
    fclose(p); 
    printf("\n\n"); 
} 

void archive(int argc, char **argv){ 
    int i; 

    char inttext[5000], textline[1000]; 
    //Allocate dynamic memory for the content to be archived! 
    arc = (content*)malloc(argc * sizeof(content)); 
    for(i=1; i< argc; i++) 
    { 
    if((f = fopen(argv[i], "r")) == NULL){ 
     printf("%s: ", argv[i]); 
     perror(""); 
     exit(EXIT_FAILURE); 
    } 
    while(!feof(f)){ 
     fgets(textline, 5000, f); 
     strcat(inttext, textline); 
    } 
    arc[i-1].text = (char*)malloc(strlen(inttext) + 1); 
    strcpy(arc[i-1].text, inttext); 
    arc[i-1].flname = (char*)malloc(strlen(argv[i]) + 1); 
    strcpy(arc[i-1].flname, argv[i]); 
    fclose(f); 
    } 
    char *filen; 
    filen=(char*)malloc(strlen(argv[argc])+1+7); 
    strcpy(filen, argv[argc]); 
    strcat(filen, ".rldzip"); 
    f = fopen(filen, "wb"); 
    fwrite(&argc, sizeof(int), 1, f); 
    fwrite(arc, sizeof(content), argc, f); 
    fclose(f); 
    printf("Success! "); 
    for(i=1; i< argc; i++) 
    { 

    (i==argc-1)? printf("and %s ", argv[i]) : printf("%s ", argv[i]); 
    } 
    printf("compressed into %s", filen); 
    readcont(filen); 
    free(filen); 
} 
void help(char *v){ 
    printf("\n\n----------------------RLDZIP----------------------\n\nUsage: \n\n Archive n files: \n\n%s $file[1] $file[2] ... $file[n] $output -a\n\nExample:\n%s a.txt b.txt c.txt output -a\n\n\n\nView files:\n\n %s $file.rldzip -v\n\nExample:\n %s fileE.rldzip -v\n\n", v, v, v, v); 
} 
void runoptions(int c, char **v){ 
    int i; 
    if(c < 2){ 
    printf("Arguments missing! Use -h for help"); 
    } 
    else{ 
    for(i=0; i<c; i++) 
     if(strcmp(v[i], "-h") == 0){ 
     help(v[0]); 
     exit(2); 
     } 
    for(i=0; i<c; i++) 
     if(strcmp(v[i], "-v") == 0){ 
     if(c != 3){ 
      printf("Arguments misused! Use -h for help"); 
      exit(2); 
     } 
     else 
     { 
      printf("-%s-", v[1]); 
      readcont(v[1]); 
     } 
     } 
    } 
    if(strcmp(v[c-1], "-a") == 0) 
    archive(c-2, v);   
} 

main(int argc, char **argv) 
{ 
    runoptions(argc, argv); 

} 
+0

readcont(v[i + 1])을한다고 생각합니다. 누락 된 탭 때문에 거의 읽을 수 없습니다. –

+0

달콤한 들여 쓰기 – pezcode

+1

for 루프를 중괄호 안에 감쌀 것을 진지하게 권고합니다. – Bart

답변

0

는 코드를 reindent 할 수있는 자유를 복용 한 후, 하나의 문제는 바로 눈에 띄는 : -v이 인수 목록에서 발견 될 때 runoptions는 경우 readcont에 호출합니다. 그리고 호출은 v[1]으로 하드 코드됩니다. 어쩌면 v[i]을 원했을까요?

+0

카즈 감사합니다,하지만 그게 내가 원했던거야! 인수 중 하나가 -v (보기 용)이고 매개 변수의 수가 2 인 경우 (v [0] _> 프로그램 자체의 이름을 고려하여 3), 파일 v [1]에 아카이브 된 파일을 표시하고, 첫 번째 매개 변수. – Roland

+0

괜찮은 프로그래밍 편집기를 사용하십시오. 예를 들면 Vim. 방금 Vim에 코드를 붙여 넣은 다음 모든 것을 선택했습니다 ('1GVG' : 1 번 라인으로 가서 시각적으로 선택하고 마지막 라인으로 이동).'= '를 치면 다시 들여 붙습니다. ': shiftwidth = 4'를 설정하고 모든 것을 선택하고'> '를 눌러 4 개의 공백 (Stackoverflow의 경우)으로 이동하십시오. 붙여 넣고 끝냈어. – Kaz

+0

Unfortunatelly, 내 랩톱에서 창문을 사용합니다 ... – Roland

0

잠깐 살펴 본 후. 나는 당신이 runoptions()readcont를 호출하는 곳에 당신이 너무 친절하고 코드를 다시 포맷시겠습니까하지 readcont(v[1])

관련 문제