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);
}
readcont(v[i + 1])
을한다고 생각합니다. 누락 된 탭 때문에 거의 읽을 수 없습니다. –달콤한 들여 쓰기 – pezcode
for 루프를 중괄호 안에 감쌀 것을 진지하게 권고합니다. – Bart