2013-04-13 4 views
0

안녕하세요 여러분,이 문제에 대한 해결책을 찾으려고 두 번째 주말에 있습니다. 저는 C 프로그래밍에 익숙하지 않고 텍스트 파일의 각 개별 라인을 읽고 각 변수를 자신의 변수에 전달하려고했습니다. 여기서 변수를 조작 할 수 있습니다 (예 : 비교, 계산 등).텍스트 파일의 각 줄을 각각의 개별 변수로 읽는 방법

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

struct line_reader { 
FILE *f; 
char *buf; 
size_t siz; 
}; 


void 
lr_init(struct line_reader *lr, FILE *f) 
{ 
lr->f = f; 
lr->buf = NULL; 
lr->siz = 0; 
} 

char * 
next_line(struct line_reader *lr, size_t *len) 
{ 
size_t newsiz; 
int c; 
char *newbuf; 

*len = 0; 
for (;;) { 
    c = fgetc(lr->f); 
    if (ferror(lr->f)) 
     return NULL; 

    if (c == EOF) { 

     if (*len == 0) 
      return NULL; 
     else 
      return lr->buf; 
    } else { 

     if (*len == lr->siz) { 

      newsiz = lr->siz + 4096; 
      newbuf = realloc(lr->buf, newsiz); 
      if (newbuf == NULL) 
       return NULL; 
      lr->buf = newbuf; 
      lr->siz = newsiz; 
     } 
     lr->buf[(*len)++] = c; 


     if (c == '\n') 
      return lr->buf; 
     } 
     } 
     } 


void 
lr_free(struct line_reader *lr) 
{ 
free(lr->buf); 
lr->buf = NULL; 
lr->siz = 0; 

}

int 
main() 
{ 
struct line_reader lr; 
FILE *f; 
size_t len; 
char *line; 

f = fopen("file.txt", "r"); 
if (f == NULL) { 
    perror("foobar.txt"); 
    exit(1); 
} 


lr_init(&lr, f); 
while (line = next_line(&lr, &len)) { 

    fputs("1: ", stdout); 
    fwrite(line, len, 1, stdout); 
} 
if (!feof(f)) { 
    perror("next_line"); 
    exit(1); 
} 
lr_free(&lr); 

return 0; 

}

:

나는 각각의 라인을 읽을 수있는 코드를 가지고 있지만, 여기 변수의 각 줄에 전달하는 방법을 확실하지 오전 코드입니다

도움이 될 것입니다.

답변

0

모든 POSIX 호환 시스템에서 제안

예)

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

char** readFile(const char *filename, size_t *lineCount){ 
    FILE *fp; 
    char buff[4096]; 
    size_t lines = 0, capacity=1024; 
    char **line; 

    if(NULL==(fp=fopen(filename, "r"))){ 
     perror("file can't open."); 
     return NULL; 
    } 
    if(NULL==(line=(char**)malloc(sizeof(char*)*capacity))){ 
     perror("can't memory allocate."); 
     fclose(fp); 
     return NULL; 
    } 
    while(NULL!=fgets(buff, sizeof(buff), fp)){ 
     line[lines++] = strdup(buff); 
     if(lines == capacity){ 
      capacity += 32; 
      if(NULL==(line=(char**)realloc(line, sizeof(char*)*capacity))){ 
       perror("can't memory allocate."); 
       fclose(fp); 
       return NULL; 
      } 
     } 
    } 
    *lineCount = lines; 
    fclose(fp); 

    return (char**)realloc(line, sizeof(char*)*lines); 
} 
void freeMem(char** p, size_t size){ 
    size_t i; 

    if(p==NULL) return; 

    for(i=0;i<size;++i) 
     free(p[i]); 
    free(p); 
} 

int main(){ 
    size_t lines; 
    char **line; 

    if(NULL!=(line=readFile("file.txt", &lines))){//lines: set line count of file 
     printf("%s", line[25]);// 26th line of file, zero origin 
    } 
    freeMem(line, lines); 
    return 0; 
} 
0

단순히 배열을 사용하는 방법에 대한 단지 m 스캔 수정 사용하는 것 :

m

for (char *line, nl; scanf("%m[^\n]%c",&line,&nl) != EOF ; free(line)) { 
    if (!line) 
     strcpy(line=malloc(1),""), getchar(); 
    // ... 
} 
가되었습니다를 5 년 동안의 표준.

관련 문제