2012-03-23 6 views
-1

archive()から呼び出された場合、readcont(char *filename)は正常に実行されます。しかし、runoptions()から呼び出されても、「アーカイブされた」ファイルはリストされません!どうしてこれなの?
プログラムはターミナルで実行する必要があります。使用法を表示するには、パラメータとして-hを使用してください。 このプログラムは、テキストファイルを ".rldzip"ファイルに "アーカイブ"するために作成されています。 rldzip.exe A.TXT B.TXT c.txt FILEXY -a archive()意志: readcont(char *x)は、ファイルにアーカイブされたファイル(*x)xから呼び出されたときに関数が正常に実行される理由を知りたいのですが

a)に成功したコール

は3つのテキストファイルをアーカイブするためのプログラムを使用して表示する必要があります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

sweetインデント – pezcode

+1

forループを中括弧で囲むことを真剣にお勧めします。 – Bart

答えて

0

はあなたのコードを字下げするために自由を取った後、一つの問題はすぐに際立っ:-vは、引数リストで発見されたときにrunoptionsのみの場合にはreadcontを呼び出します。呼び出しはv[1]にハードコードされています。多分v[i]が欲しかったでしょうか?

+0

Kazさん、ありがとうございます。引数の1つが-v(ビュー用)であり、パラメータの数が2である場合(v [0] _>プログラム名)、ファイルv [1]にアーカイブされているファイルを表示し、最初のパラメータ。 – Roland

+0

まともなプログラミングエディタを使用してください。例えばVim。 Vimにコードを貼り付けた後、すべてのものを選択しました( '1GVG':1行目、視覚的選択、最後の行に移動)、' = 'を押して再びインデントしました。 ':shiftwidth = 4'を設定してからすべてを選択し、'> 'を押して4つのスペース(Stackoverflowの場合)にシフトします。それを貼り付けてやりました。 – Kaz

+0

Unfortunatelly、私はラップトップにWindowsを使用しています... – Roland

0

簡単に見た後。私はあなたがrunoptions()readcontを呼び出しているところあなたはとても親切にして、コードを再フォーマットしてくださいだろうではないreadcont(v[1])