2014-03-02 4 views
0

입력 파일을 구문 분석하여 개별 줄을 파싱하도록 C 프로그램을 작성하려고 시도하고 있으며 각 줄마다 개별 문자가 더 파싱되어 다른 변수에 저장됩니다 struct입니다. 여기에 지금까지 내 코드 (I 개별 문자를 구문 분석 관리해야 그들이에있는 라인을 고려하지 않고)입니다 :C - 입력 파일을 줄과 문자로 구문 분석

/* create struct instances */ 
/* file open code */ 
... 
int currentChar = fscanf(fp, "%s", storageArray); 
while (currentChar != EOF) { 
    printf("%s\n", storageArray); 
    currentChar = fscanf(fp, "%s", storageArray); 
} 
... 
/* file close code */ 

가 어떻게 내 코드에 적응 할 수 있도록하는 대신 화면에 각 문자 인쇄를 갖는, 나는 다음과 같은 동작을 얻을 : (참고 : 내 프로그램에서 나는 사용자 입력이 라인에 세 문자를해야합니다 가정합니다.) 솔루션은 내가 쓴 while와 유사한 루프를 중첩 된 것을 포함 할 수처럼

INPUT FILE: 
a b c 
f e d 

LINE STRUCT 1: 
char1 = a 
char2 = b 
char3 = c 
LINE STRUCT 2: 
char1 = f 
char2 = e 
char3 = d 

내 기분이 바깥 쪽은 선을 추적하고 안쪽은 선로를 추적합니다.

+0

http://www.cplusplus.com/reference/cstdio/fgets/ – littleadv

답변

0

을 또는이 시도 :

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

#define READ_OPTIONS "r" 

struct line { 
    char char1; 
    char char2; 
    char char3; 

    struct line* next; 
}; 

struct line* g_lines = NULL; 


int main(int argc, char** argv) { 
    char buf[8] = {0}; 
    struct line* newline, *iter, *head; 
    int counter = 1; 

    FILE* fp = fopen("file.txt", READ_OPTIONS); 

    if(NULL != fp) { 
     while(fgets(buf, 8, fp)) { 
      newline = malloc(sizeof(struct line)); 
      if(NULL != newline) { 
       memset(newline, 0, sizeof(struct line)); 
       sscanf(buf, "%c %c %c", 
        &newline->char1, 
        &newline->char2, 
        &newline->char3); 

       if(NULL != g_lines) { 
        for(iter = g_lines; 
         NULL != iter->next; 
         iter = iter->next); 

        iter->next = newline; 

       } else g_lines = newline; 
      } 
     } 
     fclose(fp); 
    } else return -1; 


    /* print the contents */ 
    for(iter = g_lines; 
     NULL != iter; 
     iter = iter->next, 
     ++counter) 
     printf("Line %d: char1=%c char2=%c char3=%c\n", 
       counter, iter->char1, iter->char2, 
       iter->char3); 


    /* 
     now to free memory before returning 
     control to the operating system 
    */ 
    for(iter = g_lines; 
     NULL != iter;) 
    { 
     head = iter->next; 
     free(iter); 
     iter = head; 
    } 
    return 0; 
} 
0

int i=1,j-1;  
printf("Line STRUCT 1: "); 
while((ch = fgetc(fp)) != EOF){ 
    if(ch=='\n'){ 
    printf("Line STRUCT %d \n",++i); 
    j=1; 
    } 

    printf("Char %d = %c \n",ch,j++); 

} 
+0

을 귀하의 답변에 감사드립니다. 그러나, 나는 "char % d"를 명백하게 인쇄하려고하지 않았습니다 ...이 문자들을 구조체 "Line"의 일부인 변수에 저장하고 싶습니다. (예 : "Line"의 변수 "char1"에 첫 번째 문자를 저장) – user41419

+0

하나의 특정 라인에서 얼마나 많은 문자가 미리 정의되어 있는지 알고 있습니다. –

+0

예, 라인 당 문자 수는 미리 정의되어 있습니다. 한 줄에 3 개의 문자가 있고 내가 만든 각 "선"구조체에 대해이 세 문자를 구조체 변수 char1, char2, char3에 각각 배치하고 싶습니다. – user41419

0

는이 작업을 수행하십시오 :

for (int i=0; !feof(fp); i++) 
    fscanf(fp,"%c %c %c ", 
     &storageArray[i].char1, 
     &storageArray[i].char2, 
     &storageArray[i].char3);