2016-11-28 3 views
0

파일의 p 번째 레코드와 q 번째 레코드를 바꿀 함수를 작성해야합니다. 파일 이름, p 및 q는이 함수에 전달되어야합니다. 나는 포럼의 톤을 검토 한인덱스가 주어진 텍스트 파일에서 2 줄을 바꿔주는 C 함수

Derrek 123 4.00 
Egg 234 3.00 
Banana 345 2.00 
Griffen 456 1.00 
Lucas 987 2.00 

:

텍스트 파일 데이터는 학생 (이름, 학생증, GPA) 에뮬레이트 일반적으로 다음과 같이 예정되어있는 구조체의 기반 그리고 자습서 그리고 그것은 내가 각 라인의 길이를 모르는 경우 전체 파일을 읽을 필요가있는 것 같습니다.

가능 : 1.) 전체 파일을 읽지 않고 인덱스로 파일의 2 줄 전체를 읽으십시오. 2.이 두 줄을 스왑하고 파일에 쓰십시오. 1) (이 일 것으로 보인다) 2) 내가 원하는 행을 찾아서에 저장 전체 텍스트 파일을 읽어

그렇지 않으면 내가하는 방법을 알고 내가 좋아하는 것이 스파게티 엉망이 char 내 코드는 그냥 문자열의 길이를 잡는 것 같다. 전체 String을 저장하고 싶습니다. 3.)이 두 문자열 값을 바꿔 넣습니다. 나는 포인터를 사용하여 시도했다. 나는이 잘못을하고 있음을 확신한다. 4.)이 2 개의 문자열 값을 파일의 색인에 씁니다. 이 부분에서는 알려진 인덱스가 주어지면 파일에 p와 q를 쓸 수 있습니까? 아니면 전체 파일을 다시 반복해야합니까?

//Switch Function 
struct Student switchRecords(char filename, int p, int q){ 
    //Declare Variables 
    int c = 0, temp; 
    char pText, qText; 


    //Open file 
    //Read p and q from file 
    //Store P and q into temporary variables 
    FILE *fp2 = fopen("student.db", "r"); 
    //Error check 
    if(fp2 != NULL){ 
     char line[252];//max line size 
     while(fgets(line, sizeof line, fp2) != NULL){ 
      if(c == p){ 
       pText = puts(line); 
       c++; 
      } 
      else if(c == q){ 
       qText = puts(line); 
       c++; 
      } 
      else{ 
       c++; 
      } 
     } 
     fclose(fp2); 
    } 
    else{ 
     printf("Error, File doesn't exist."); 
    } 

    //Gets real spaghettii about here 
    int* pp = pText; 
    int* qp = qText; 


    printf("P value b: %d\n", pText); 
    printf("Q value b: %d\n", qText); 
    printf("Pp value b: %d\n", pp); 
    printf("Qp value b: %d\n", qp); 
    //Swap 
    temp = *pp; 
    *pp = *qp; 
    *qp = temp; 

    printf("P value a: %d\n", pText); 
    printf("Q value a: %d\n", qText); 
    printf("Pp value a: %d\n", pp); 
    printf("Qp value a: %d\n", qp); 
//p = p p^q 
//q = p p^q 
//p = p p^q 
//Write to file - TODO! 
} 

답변

0

char 및 char * 유형이 혼합되어 있습니다.

#include <stdio.h> 
#include <string.h> 

//Switch Function 
void switchRecords(char* filename, int p, int q){ 
    //Declare Variables 
    int c = 0, temp; 
    char pText[252], qText[252]; 
    FILE* fp1, *fp2; 

    //Open file 
    //Read p and q from file 
    //Store P and q into temporary variables 
    fp2 = fopen("student.db", "r"); 
    //Error check 
    if(fp2 != NULL){ 
     temp=0; 
     char line[252];//max line size 
     while(fgets(line, sizeof line, fp2) != NULL){ 
      if(c == p){ 
       strcpy(pText,line); 
       ++temp; 
      } 
      else if(c == q){ 
       strcpy(qText, line); 
       ++temp; 
      } 
      c++; 
      if (temp==2) break; //because we have got the two lines! 
     } 
     fclose(fp2); 
    } 
    else{ 
     printf("Error, File doesn't exist."); 
    } 


    //Write to file - TODO! 
    fp1 = fopen("student.db.new","w"); 
    fp2 = fopen("student.db", "r"); 
    c = 0; 
    if(fp1 != NULL && fp2 != NULL){ 
     char line[252];//max line size 
     while(fgets(line, sizeof line, fp2) != NULL){ 
      if(c == p){ 
       fputs(qText, fp1); 
      } 
      else if(c == q){ 
       fputs(pText, fp1); 
      } 
      else{ 
       fputs(line, fp1); 
      } 
      c++; 
     } 
     fclose(fp1); 
     fclose(fp2); 
    } 
    else{ 
     printf("Error, File create error."); 
    } 
} 

int main(int argc, char* argv[]){ 
    switchRecords("input.txt", 2, 3); 
    return 0; 
}