2014-07-09 3 views
0

파일에서 텍스트를 읽고 구조체로 분해하고 특정 조건에 맞게 섹션의 유효성을 검사 한 다음 두 개의 새 파일을 생성하는 프로그램을 작성해야합니다. 하나는 오류가있는 데이터이고 다른 하나는 오류가있는 데이터입니다. 지금까지 나는 파일에서 데이터를 분리하여 구조체에 저장하는 단계에 이르지만 처음 두 변수에서만 작동합니다. 텍스트는 콜론으로 분리하고, I는 변수 노호로 각 섹션을 넣어야하는 텍스트 파일 여기C에서 파일의 구조체 메모리 할당 두 변수 만 작동합니다.

0001:0002:0003:0021:CLS 

예 내 구조체이다

벨로 그러나 미세 whatworks이다
struct packet{ 
int source; 
int destination; 
int type; 
int port; 
char data[50]; 
}; 

곧 타입 변수에 데이터를 추가하는 다른 섹션을 추가하면 프로그램이 작동하지 않습니다.

 fscanf(inFile, "%[^:]: %[^:]:", records[i].source, records[i].destination); 
         printf("%d - %s _ %s", i+1, records[i].source, records[i].destination); 

그러나 이것은 작동하지 않으며 필요합니다. 나는 그것을 확장해야한다.

   fscanf(inFile, "%[^:]: %[^:]: %[^:]:", records[i].source, records[i].destination, records[i].type); 
         printf("%d - %s _ %s _ %s", i+1, records[i].source, records[i].destination, records[i].type); 
         } 

난 아무것도 fscanf 기능에 문제가 그렇게 생각 메신저를 저장되지되고 있기 때문에 내가 기대하는대로 null을 표시하는 구조체에 아무것도 입력하지 않고는 printf합니다. 처음 두 가지로 작동하므로 구문 문제이므로 메모리 문제 여야합니다. 나는 malloc과 realloc을 사용했지만 필자는 그것과 혼동하여 내가 올바르게하지 않았 음을 확신한다.

전체 코드 목록은

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

//declaration of function which will print my name and student number 
const char * myname(); 
//declaration of a function that will prompt a user to enter a file and open it if it exists 
int openfile(); 

struct packet{ 
    int source; 
    int destination; 
    int type; 
    int port; 
    char data[50]; 
    }; 


int main() 
{ 
int recordCount = 0; 

struct packet *records; 
records =malloc(sizeof(struct packet)); 
// printing the my name and student number via the myname function 
printf("%s\n", myname()); 
//executing the openfile function that will open a function 
openfile(recordCount, records); 


return 0; 
} 


const char * myname() 
{ 
const char *x = "*************************\nUSERNAME\nUSER NUMBER\nCONTACT NUMBER\n*************************\n"; 
return x; 
} 


int openfile(int rCount, struct packet *records) 
{ 
//file pointer which will keep track of the file being accessed 
FILE *inFile ; 
//creating variable that will hold what the user has entered for a filename to open 
char inFileName[100] = { '\0'}; 

printf("Please Enter the File to open:"); 
//getting the users input and storing it into the variable just created 
scanf("%s", inFileName); 
//if the file does not exist, display an appropriate error message 
     if ((inFile = fopen(inFileName, "r")) == NULL) 
     { 
      printf("Cannot Open File **%s**\n", inFileName) ; 
      exit(1) ; 
     } 

     else { 
     //if the file does exist, process the data 
      while(fgets(inFileName, 100, inFile)!=NULL) 
       { 


       int i =0; 
       for (i=0; i<30;i++) 
          { 
          fscanf(inFile, "%[^:]: %[^:]: %[^:]:", records[i].source, records[i].destination, records[i].type); 
          printf("%d - %s _ %s _ %s", i+1, records[i].source, records[i].destination, records[i].type); 
         } 



       } 

     //close the file 
     fclose(inFile); 
     return 0; 
     } 

}; 

답변

1

당신은 잘못을 다하고 :

fscanf(inFile, "%[^:]: %[^:]:", records[i].source, records[i].destination); 

%[] 변환 지정 문자열입니다, 그러나 문자 인 것처럼 정수의 값을 전달하는 포인터. 정의되지 않은 동작!

최신 컴파일러, 즉 서식 문자열의 유효성을 검사하는 최신 컴파일러에서 경고에 대한 정보를 얻을 수 있어야합니다. 당신은 단지 첫 번째 경우에 대한

fscanf(inFile, "%d:%d", &records[i].source, &records.destination); 

을 수행하지 않을 이유가 문자열 인 것처럼 정수를 구문 분석에 아무 소용이 없다

, 나는 이해가 안 돼요.

또한,이 훨씬 더fscanf()으로 두 단계를 결합하는 것보다, 다음 sscanf()을 사용하여 읽을 번 라인을 구문 분석, fgets()를 사용하여 전체 라인 읽기의주의 않습니다.

마지막으로 얼마나 많은 변환이 성공했는지 알기 위해 변환 호출의 반환 값을 확인해야합니다.

+0

감사합니다. 나는 병이 다시 시작된다고 생각한다. – user3262678