2013-09-23 5 views
2

처음으로 여기에 질문하는 것이므로 최선을 다하겠습니다. C에서 위대하지는 않습니다. 저는 중급 C 프로그래밍에만 중점을 둡니다.텍스트 파일 검색 및 읽기

나는 작업중인 파일을 읽는 프로그램을 작성하려고합니다. 하지만 단어를 검색 한 다음 단어를 배열에 저장합니다. 내가 지금 가고있는 것은 말할 줄이있는 파일에서

for(x=0;x<=256;x++){ 
fscanf(file,"input %s",insouts[x][0]); 
} 

이다 "입력 A0는;" "A0"을 insouts [x] [0]에 저장하고 싶습니다. 256은 텍스트 파일에 얼마나 많은 입력이 있는지 모르기 때문에 필자가 선택한 번호입니다. 당신이 가지는가는 배열의 요소와 거기 저장된 값의 주소를 전달하려는

char * insouts[256][2]; 
+0

무엇이 문제입니까? 작동하지 않는 것은 무엇입니까? –

+0

"A0"을 배열에 저장하지 않거나 atleast thats를 인쇄하지 않을 때 얻는 결과를 저장하지 않습니다. 그냥 이상한 문자들을 내놓는다. – TylerM

+0

'fscanf()'의 반환 값을 확인한다. 형식의 경우 성공하면 1을, 그렇지 않으면 0을 반환합니다. 데이터는 '입력'과 '값'이 번갈아 구성되어야합니다 (여기서 값은 철자를 변경할 수 있지만 입력은 불가능합니다). 그들 사이에는 공백이 있어야합니다. 나는 공백 문자를 공백 문자 앞에 두어 공백 문자 (''input % s '')를 건너 뜁니다. 데이터가 그렇게 포맷되지 않았다면, 아마도 fscanf() 대신에'fgets()'와'sscanf()'를 사용해야 할 것입니다. 나는'fscanf()'를 사용하기가 더 쉬워서 가르치기 더 쉬웠 으면 좋겠다. 그것은 초보자를위한 지뢰밭 전체 또는 함정입니다. –

답변

0

사용 (테스트되지 않은 및 컴파일되지 않은 코드) 뭔가를 할 수 있습니다. 형식 스캔으로 인한 별도의 I/O

#define N (256) 
char insouts[N][2+1]; // note: no * and 2nd dimension is 3 
for(size_t x = 0; x < N; x++){ 
    char buf[100]; 
    if (fgets(buf, sizeof buf, stdin) == NULL) { 
    break; // I/O error or EOF 
    } 
    int n = 0; 
    // 2 this is the max length of characters for insouts[x]. A \0 is appended. 
    // [A-Za-z0-9] this is the set of legitimate characters for insouts 
    // %n record the offset of the scanning up to that point. 
    int result = sscanf(buf, "input %2[A-Za-z0-9]; %n", insouts[x], &n); 
    if ((result != 1) || (buf[n] != '\0')) { 
     ; // format error 
    } 
} 
0

:로

나는 insouts 선언합니다. 이렇게하려면 주소 연산자 &을 사용할 수 있습니다.

나는

또한, 당신은 단지 모든 문자열에 대해 2 바이트를 할당하고 있습니다 :

for(x = 0;x < 256; x++){ 
    fscanf(file,"input %s", &insouts[x][0]); 
    // you could use insouts[x], which should be equivalent to &insouts[x][0] 
} 

트릭을 할 것이라고 생각합니다. 문자열이 널 문자로 종료 할 필요가 명심하십시오, 그래서 당신은 그러나

char * insouts[256][3]; 

에 배열 할당을 변경해야합니다, 나는 % s이 (가) A0;뿐 아니라 A0 일치합니다 확실 해요, 그래서 당신은 수도 이것을 설명 할 필요가있다. 너비와 함께 % c를 사용하여 주어진 문자 수를 읽을 수 있습니다. 그러나 널 바이트를 직접 추가하기 위해 추가합니다. 이 작동 (테스트하지)해야합니다

char* insouts[256][3]; 
for(x = 0; x < 256; x++) { 
    fscanf(file, "input %2c;", insouts[x]); 
    insouts[x][2] = '\0'; 
} 
+0

알았어.하지만 그것을 인쇄하려고 할 때 난 그냥 무작위로 문자를 얻는 것 같아. printf ("% c ", insouts [x] [0]) printf ("% c ", insouts [x] [1]) printf ("% c ", insouts [x] [2]), – TylerM

+0

내 편집을보고 그것이 작동하는지 확인 :) 그런데 printf ("% s \ n", insouts [x]); 인쇄 할 수 있습니다. –

+0

아니요, 여전히 작동하지 않았습니다. 그냥 임의의 글자. 파일에서 : 입력 A0; 입력 A1; 입력 A2; 입력 A3; 입력 B0; 입력 B1; 입력 B2; 입력 B3; 출력 GT; 출력 LT; 내가 당신을 쫓아가는 중이라면 입력 목록을 바로 출력해야합니다. – TylerM

0

오히려 당신이 "getdelim"를 사용하지 않는 이유 fscanf 사용하는 것보다 ';' 구분 기호로 사용합니다. 설명서 페이지에 따라

"getdelim()은 구분 기호 인수로 줄 바꿈 문자 이외의 줄 구분 기호를 지정할 수 있다는 점을 제외하고는 getline()과 유사합니다 .getline()과 마찬가지로 구분 문자는 추가되지 않습니다 파일 끝에 도달하기 전에 입력에 존재하지 않았습니다. "

그래서 당신은 fgets() & sscanf()

char *line = NULL; 
size_t n, read; 
int alloc = 100; 
int lc = 0; 
char ** buff = calloc(alloc, sizeof(char *)); // since you don't know the file size have 100 buffer and realloc if you need more 
FILE *fp = fopen("FILE TO BE READ ", "r"); 
int deli = (int)';'; 
while ((read = getline(&line, &n, fp)) != -1) { 
    printf("%s", line); // This should have "input A0;" 
    // you can use either sscanf or strtok here and get A0 out 
    char *out = null ; 
    sscanf(line, "input %s;", &out); 
    if (lc > alloc) { 
     alloc = alloc + 50; 
     buff = (char **) realloc(buff, sizeof(char *) * alloc); 
    } 
    buff[lc++] = out 
} 

int i = 0 ; 
for (i = 0 ; i < lc; i++) 
    printf ("%s\n", buff[i]); 
+0

나는 작동하고 감사 할 것이라고 확신합니다. 도움을 요청했는데 특별히 그 중 일부는 이해하지 못합니다. 수업 시작시 할당을하지 못했다는 것을 알고 있습니다. 곧 시작할 것이라고 말했기 때문입니다. – TylerM