2017-10-27 8 views
1

나는 c로 프로그래밍하는 것이 정말 새롭다 고 말하기 시작한다.헤더 파일과 파일 핸들링을 만드는 법

ok .... 질문이 동일하지 않습니다 ... 프로그램이 파일을 열고 더 이상 아무것도하지 않더라도 꽤 잘 보이는 많은 것들을 수정했습니다. 나는 낱단 경고 그러나 아무런 오류가있다. 걱정은 allmoust allways 동일합니다 ... 부적합한 포인터 유형 ... 제 코드를 보시고 저를 도와 주시겠습니까? 감사합니다

#include <stdio.h> 



///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//                            // 
//    Definitions - Informations to the preprocessor             // 
//                            // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

#define MAX_SIZE 1024 
#define ERROROF "Could not open the file!!!" 
#define SUCCESS "file sucessefuly opened!!!" 


///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//                            // 
//    Functions - Implementation of several functions            // 
//                            // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

int counting_lines(int *ptr){ 
char c; 
int lines=0; 

    do 
    { 
     c=fgetc(ptr); 


     if (c="\n"){ 
      lines++; 
     } 
    } 
    while((c!=EOF)); 

    return lines; 
} 


int freading_diff(int *ptr, int a, int numb_lines_total) /* Function definition */ 
{ 
    char *lines2ptr; 
    char lines2[numb_lines_total-2*a]; 

    char buffer[MAX_SIZE]; 

    int i; 

    for (i=0; i<numb_lines_total-2*a; i++){ 
    lines2[i]=fgets(buffer, MAX_SIZE, ptr); 
} 
    return &lines2ptr; 

} 



int freading_common(int *ptr1, int *ptr2, int a) /* Function definition */ 
{ 
    char *lines1ptr; 
    char lines1[2*a]; 
    lines1ptr=lines1[0]; 
    char buffer[MAX_SIZE]; 

    int i=0; 

    for (i=0; i<a; i=i+2){ 
    lines1[i]=fgets(buffer, MAX_SIZE, ptr1); 
    lines1[i+1]=fgets(buffer, MAX_SIZE, ptr2); 
    } 
return lines1ptr; 

} 


void screen_printing(char *lines1ptr, char *lines2ptr, int a, int numb_lines_total) 
{ 
    int i=0; 

    for (i=0; i<2*a; i++) 
    { 
     printf(lines1ptr+i); 
    } 
    for (i=0; i<numb_lines_total-2*a; i++) 
    { 
     printf(lines2ptr+i); 
    } 
} 


void main(void) 

{ 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//                            // 
//            Opening the files            // 
//                            // 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

    FILE *ptr1; 
    FILE *ptr2; 
    char filename1[255];   //variable to store the name of the first file 
    char filename2[255]; 
    printf("First file : ");  //prompts the user about the name of the first file 
    scanf("%63s", filename1); 
    printf("Second file : ");  //prompts the user about the name of the first file 
    scanf("%63s", filename2); 

    if((ptr1 = fopen(filename1,"r")) == NULL) //checks if the first file can be opened 
    { 
     printf("%s %s \n",ERROROF, filename1); 
     return -1; 
    } else printf("%s %s ADDRESS %d\n",SUCCESS, filename1, &ptr1); 
    if((ptr2 = fopen(filename2,"r")) == NULL) //checks if the first file can be opened 
    { 
     printf("%s %s \n",ERROROF, filename2); 
     return -1; 
    }else printf("%s %s ADDRESS %d\n",SUCCESS, filename2, &ptr2); 


    int numb_lines_total=0; 

    int a=0, b=0; 

    int lines1=0, lines2=0; 

    int *pointerline1, *pointerline2; 

    int readlines1, readlines2; 
    pointerline1=&readlines1; 

    pointerline2=&readlines2; 
    lines1=counting_lines(ptr1); 
    lines2=counting_lines(ptr2); 
    numb_lines_total = lines1+lines2; 
    printf("First file has %d lines. Second file has %d lines. %d lines will be printed on the screen\n",lines1, lines2, numb_lines_total); 

    if (lines1<lines2) 
     { 
     a= lines1; 
     b= 2*a+1; 
     readlines1=freading_diff(ptr2, a, numb_lines_total); 
     } else if (lines1>lines2) 
       { 
        a= lines2; 
        b= 2 * a + 1; 
        readlines1=freading_diff(ptr1, a, numb_lines_total); 
       } else { 
         a= lines1; 
         } 
    readlines2=freading_common(ptr1, ptr2, a); 
    screen_printing(pointerline1, pointerline2, a, numb_lines_total); 


    fclose(ptr1); 
    fclose(ptr2); 


    return; 
} 
+2

'char x'는 전체 파일 이름이 아닌 단일 문자입니다. 'fopen'을 체크하면'const char * filename' 매개 변수를 취합니다. 아마도 귀하의 기능도 그렇게해야합니다. –

답변

0

당신의 파일 열기 기능이 파일을 열었지만 아무 것도하지 않습니다. fp 변수는 프로그램이 함수 실행을 마자 마자 사라질 로컬 변수입니다.

"fopen"함수는 파일의 시작 부분에 대한 포인터를 반환합니다. 파일을 읽으려면 포인터가 필요합니다.

게다가, 나는 당신이 원하는 것을 정말로 모른다. 당신은 더 잘 지정해야한다.

무엇이 문제입니까? 코드가 컴파일됩니까? 1 또는 0이 인쇄됩니까?

더 많은 것을 묻는 또 다른 답변을 추가하는 대신 다른 주제를 작성하거나 편집해야합니다. "-1073741819 (0xC0000005) **"는 무슨 뜻인지 아는 사람이 있습니까? 메모리 위반을 어떻게 알 수 있습니까? 그것을 말하는 오류를 인쇄 했습니까? valgrind를 실행 했습니까? 그 중 어떤 것도 모릅니다. 여기에 게시하는 방법을 실제로 배워야합니다.

그 외에도 귀하의 코드가 EOF를 인쇄하려고합니다.

file.txt 
a 
b 
c 
EOF 

1º loop - is scanf != EOF? yes, loop again 
    print "a" 
2º loop - is scanf != EOF? yes, loop again 
    print "b" 
3º loop - is scanf != EOF? yes, loop again 
    print "c" 
4º loop - is scanf != EOF? no. Do not loop again 
    print "???" 

오류.

+0

내가 정말로 원했던 것은 (지금은) 파일을 열었을 뿐이었다. (나는 파일을 닫는 것을 잊었다는 것을 깨달았다.) 파일이 열렸는지 확인하기 위해 0 또는 1을 인쇄하십시오. –

+0

난 당신의 코드와 함께 유일한 문제는 당신이 매개 변수로 char를 선언하고 문자열을 전달하는 것입니다 생각합니다. 내 코드 버전을 완료했는데 작동했습니다. –

+0

"EOF"를 인쇄하는 것을 멈 추면 작동합니다. –