2014-11-04 2 views
1

내가 같은 형식의 여러 고객 레코드 파일이 포함 된이 확인 :다음 줄

CUSTOMER ... 
details... 
details... 
CUSTOMER... 
details... 
details... 
details... 
CUSTOMER... 
. 
. 

나는 두 가지로 파일을 분할 할 필요가있다. 현재 파일의 모든 줄을 계산하고 2으로 나눈 다음 해당 줄이 CUSTOMER 문자열로 시작하는지 확인하십시오.

만약 그렇다면 고객 앞으로 모든 줄을 어떻게 인쇄 할 수 있습니까? 그렇지 않은 경우 다음 줄이 CUSTOMER로 시작하면

는 어떻게 확인할 수 있나요?

내 코드 :

int main(int argc, char *argv[]) 
{ 
    char ioarea[1000]; 
    int TotCustLines=0,i=0; 

    int reqLine=0; 
    int getLine=0; 

    if((inFile=fopen(argv[inFileName],"r"))==NULL) 
     printf("Failed to open input file"); 

    while(fgets(ioarea,BUFFER_SIZE,inFile)) 
    { 
     TotCustLines++; 
    } 
} 
if(TotCustLines/2==0) 
    reqLine=(TotCustLines/2); 
else 
    reqLine=(TotCustLines/2)+1; 
fseek(inFile,1,SEEK_SET); 
while(fgets(ioarea,BUFFER_SIZE,inFile)) 
{ 
    getLine++; 
    if(getLine==reqLine) 
    { 
     if(strncmp(getLine,"CUSTOMER RECORD",15)==0) 
     //How to write all the lines before customer record. 
     //If not how can i check next line. 
    } 
} 

해결책을 제안하십시오. 나는 C 파일 개념이 처음이다.

+1

들여 쓰기 코드 –

+0

'(strncmp (의 getline, "고객 레코드", 15) == 0)'의 경우 ->'경우 (STRCMP (ioarea, "고객 RECORD \ 없음") == 0)' – chux

+0

마 2 개의 새 파일을 만들고 원본 파일을 제거 하시겠습니까? – anatolyg

답변

0

당신이 고객 (또는 다른 것)에 대한 결과 라인을 통해 검색 한 후, 파일을 읽는 데 사용할 수있는 방법 :

얻을

1) 파일 크기 (fseek()/ftell() 사용), 또는 라인을 얻을 수 예 1를 사용 카운트 및 가장 긴 라인.
2) 만들고 문자열 배열을위한 메모리를 할당, char **buffer;예 2
3) 당신이 가서 buffer[index]을 통해 색인, fgets()를 사용하여 배열로 파일을 읽을 참조하십시오.
4) 배열 버퍼 []에 색인 줄이 포함됩니다.

strstr() 문자열 비교 함수를 사용하여 저장 한 행에서 고객을 찾을 수 있습니다.

예 1 개 파일의 라인 카운트를 얻는 방법과 (메모리를 생성하는) 길이가 긴 라인

int cnt=0; 
int len=0; 
int keep=0; 
char line[260];// == MAX_PATH_LEN in windows, pick longer value if needed. 
while(fgets(line, 260, fp))//get each line in file 
{    
    len = strlen(line);//track length of each new line 
    if(len > keep) keep = len;//keep only longest line 
    cnt++;      
} //keep will have value for longest line, cnt will have number of lines 

예 2 (C 문자열의 배열 메모리를 만들기 char **string;) :

참고 : 함수를 작성하고 전화 통화의 충분한 :

char **variable = {0}; 
int cnt, maxlen; 
variable = allocMemoryStr(variable, &cnt, &maxlen); 

........

char ** allocMemoryStr(char **strings, int numStrings, int maxLen) 
{ 
    int i; 
    strings = calloc(numStrings, sizeof(char*));// create pointers to arrays 
    for(i=0;i<numStrings; i++) 
    { 
     strings[i] = calloc(maxLen + 1, sizeof(char));// create memory for each array 
    } 
    return strings; 
} 
0

하나의 솔루션은 변경된 데이터를 작성하는 임시 파일을 사용하는 것입니다.

[CUSTOMER_ID] 
    Info1 = value1 
    Infon = "value n" 

은 '표준 함수 라이브러리'

0
에 대한 http://legacy.imatix.com/html/sfl/index.htm를 참조하십시오

1) Read old file line by line 
2) Check (using strncmp())/modify data 
3) Write modified data to a new temp file 
4) After completing all the modification, simply replace temp file with your old file (using rename()). 

또 다른 더 나은 솔루션 형태로 데이터를 저장합니다 '표준 함수 라이브러리'와 같은 라이브러리를 사용하는 것입니다

모든 행을 선택한 행에 쓸 수는 없습니다. 적어도 직접적으로. 코드는 "작업을 두 번 수행해야합니다": 두 출력 파일 각각에서 고객 행 수가 결정되면 다시 시작하여 한 줄씩 읽고 각 줄을 필요한 파일에 출력해야합니다. , 입력 파일을 다시 설정 한 후

FILE *file1; 
FILE *file2; 
FILE *file_req; 
int customer_counter = 0; 

... 

file1 = fopen("file1.out", "w"); 
file2 = fopen("file2.out", "w"); 
file_req = file1; // start outputting to the first file 

를 다시 라인 읽기와 고객 계산 루프를 수행 쓰기 위해 다음

while(fgets(ioarea,BUFFER_SIZE,inFile)) 
{ 
    if(strncmp(getLine,"CUSTOMER RECORD",15)==0) 
     TotCustLines++; 
} 

, 열린 두 개의 파일 :

는 고객 레코드를 계산하려면 이번에는 논리가 추가되었습니다 :

while(fgets(ioarea,BUFFER_SIZE,inFile)) 
{ 
    if(strncmp(getLine,"CUSTOMER RECORD",15)==0) 
     customer_counter++; 
    if (customer_counter == reqLine) 
     file_req = file2; // switch to the second file 
    fputs(ioarea, file_req); // write the line to whatever file it must go to 
} 

일부 메모 :

처음부터 파일 읽기를 시작하려면 rewind을 사용하십시오. 시크릿 위치 0 (참고 : 1이 아님)과 함께 fseek을 사용할 수도 있습니다.

rewind(file); // does the same as fseek 

2로 번호를 분할하려면 2로 나눌 수 있는지 여부를 확인 할 필요가 없습니다 :

reqLine = (TotCustLines + 1)/2; 

당신은 대략 예상이 가장 긴 줄의 길이를 결정하는 매크로 BUFFER_SIZE 것을 가지고 . 버퍼 선언에도 사용해야합니다. 변경하기로 결정한 경우 버퍼 크기가 자동으로 조정됩니다.

char ioarea[BUFFER_SIZE]; 

그러나, 그 목적을 위해 큰 상수를 사용하는 것은 본질적으로 안전하지는 않습니다 (예상치 못한 버그와 해커 공격에 프로그램을 엽니 다),하지만 난 당신이이 단계에서 그것에 대해 생각하고 싶지 않은 것 같아요.

관련 문제