2014-03-03 4 views
1

제가하려는 것은 단순한 개념이지만 실제로는 실제로 작동시키지 못합니다.파일을 2D 문자 배열로 읽어들입니다.

내가 읽으려고하는 파일이 3 열 있습니다. 첫 번째와 두 번째는 정수 열이고 세 번째는 문자열입니다.

이 파일의 내용을 가져 와서 일련의 배열에 쓰려고합니다. 내 문제는 문자 배열, 2 차원에 놓여 있습니다.

Weight Value Object 
1  10  (null) 
2  25  (null) 
5  40  (null) 
7  100  (null) 

나는에있는 파일을 구문 분석을 시도해야합니다

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

#define NUMBER 128 //Maxmimum number of items/lines in file. 
#define BUFFER 120 //Buffer length. 
#define LENGTH 32 //Maximum length of lines in file. 

//------------------------Global Variables. --------------------------------------------- 
int iterations=0; //Will count number of times the calculation function is called. 

int weight[NUMBER];  
int value[NUMBER];  
char object[NUMBER][LENGTH];   

//------------------------Main. --------------------------------------------------------- 
int main(void) 
{ 
    FILE *fp; //File pointer. 
    char buffer[120]; //Temporary storage 
    int result; 
    int i,j=0; 

    int weight[NUMBER];  
    int value[NUMBER];  
    char object[NUMBER][LENGTH];  

    fp=fopen("knapsack.data","r"); 
    if(NULL==fp){ 
     printf("Error opening file. \n"); 
     exit(0); 
    } 

//Print the file. 
    printf("Weight \t Value \t Object \n"); 

    for(i=0;i<=NUMBER;i++){ 
     while(NULL != fgets(buffer, 120, fp)){ 
       result=sscanf(buffer, "%d %d %s", &weight[i], &value[i], object[i][0]); 
       printf("%d \t %d \t %s \n", weight[i], value[i], object[i][0]); 
     } 
    } 
    for(j=0;j<4;j++){ 
     printf(" String i equals %s \n", object[j]); 
    } 

    fclose(fp); 
} 

I가 발생하고있어 문제는 인쇄에, 내가 문자열 칼럼의 내용과 같이 (NULL) 인 것을 찾을 수 있다는 것입니다 다른 방법, 아니면 내가 누락 된 작은 것입니까? 미리 감사드립니다.

답변

2

sscanfprintf 모두에 앰퍼샌드 &object[i][0]가 필요합니다. 또한 컴파일러는 형식 오류에 대해 불평 할 수 있습니다.이 경우 다음과 같이 캐스팅해야합니다. (char *)&object[i][0]

+0

하여 &없이, 두 부분에서 잘 작동합니다 : 이런 식으로 뭔가 작업을해야합니다 그 첫 번째 printf (while 루프)에서 작동합니다. 감사합니다. : 프로그램이 두 번째 문을 통해 떨어질 때, 나는 출력이 되나 무슨 확실하지 않다 : '''무게 값이 객체 1 10 마우스 2 (25)의 휴대 전화 5 40 태블릿 (7) (100) 노트북 문자열 내가 내가 내가 내가 예, 그것은 동일합니다 ''' – alldavidsluck

+1

동일 문자열에 해당 문자열에 해당 노트북 문자열 같습니다. '& object [j] [0]'을 사용하십시오. 31보다 큰 길이의 문자열이 있으면 서로 오버런하는 문자열로 이어질 수 있으므로 여전히 문제가있을 수 있습니다. –

+0

그 밖의 뭔가가 있어야합니다. 문자열의 길이는 20도되지 않습니다. 당신의 도움을 주셔서 감사합니다! 우수 답변으로 선정되었습니다. – alldavidsluck

1

& object [i] [0] 또는 object [i]를 사용하십시오. 둘 다 교환 가능하게 사용할 수 있습니다. C 문자열의 경우와 동일)

출력물이 왜 성공적으로 인쇄되지 않는지는 파일에서 데이터를 읽는 방식과 관련이 있습니다. While 루프 내에서 if 문을 사용하여 NUMBER 회 실행되는 반복을 확인해야하는 경우 while 루프를 사용하고 있습니다.

i = 0; 
while(NULL != fgets(buffer, 120, fp)) 
{ 
    if(i < NUMBER) 
    { 
     result = sscanf(buffer, "%d %d %s", &weight[i], &value[i], object[i]); 
     printf("%d \t %d \t %s \n", weight[i], value[i], object[i]); 
     i++; 
    } 
} 

내가 당신의 코드와 내가 만든 샘플 knapsack.data 파일을 사용하여이 작업을 테스트하고 그것은 방법 :

+2

i = 0; 사실 여기에 열쇠가있었습니다. 나는 두 줄의 int i, j를 가지고있다. i = j = 0; 하지만 우연히 그들을 결합했습니다. 예, 개체의 sscanf는 &와 [0]의 유무에 관계없이 둘 다 시작하는 위치를 지정하는 것을 선호합니다. 당신이 이것에 투입 할 시간을 주셔서 정말 고마워요. :) – alldavidsluck

관련 문제