2012-05-31 5 views
2

저는 C 언어를 처음 접했고 C 언어를 배우고 싶었 기 때문에 Java/Python으로 데이터를 생성하고 복사/붙여 넣기하는 대신 모든 것을 함께 실행할 수있었습니다. 내 Cuda 프로그램에서 수동으로 재생). 큰 파일 (20 + gb)을 열고 일부 데이터를 구문 분석하려고하지만 문제가있어서 먼저 파일을 한 줄 씩 다른 파일로 열어 읽을 수 있는지 확인하기 위해 내 문제를 해결하려고했습니다. 한 줄의 출력 샘플을 가져 와서 구문 분석을 시도하면 모든 것이 잘되면 간단히 함께 가져올 수 있습니다. 나는 각각의 부분을 작동 시키도록 관리했지만 (일부 투쟁 후에) 각 부분을 작동 시키지만 함께 결합하면 작동하지 않는다. (QT 작성자 &QT 작성자가 예기치 않게 나가고 일식이 멈 춥니 다.).두 가지 기능이 작동하지만 작동하지 않을 때

여기에 (내가 원하는대로 정확히 작동) 파싱 부분 : 나는 파일의 각 행을 인쇄하는 경우 내가 얻을 같은 변수 라인에

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

int main() 
{ 
    char line[1024] = "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4],"; 
    size_t len = strlen(line); 
    memmove(line, line+1, len-3); 
    line[len-3] = 0; 
    printf("%s \n",line); 


    char str[100], *s = str, *t = NULL; 

    strcpy(str, line); 
    while ((t = strtok(s, " ,")) != NULL) { 
     s = NULL; 
     printf(":%s:\n", t); 
    } 
    return 0; 
} 

데이터는 정확히이다. 하지만 복사/붙여 넣기를 주 프로그램에 붙여 넣으면 작동하지 않습니다 (QT는 아무것도 표시하지 않고 일식이 첫 번째 줄만 표시 함). 내가 할 수없는

Starting.. 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4 

:이 코드는 위의 명령을 감싸되는 몇 가지 파일 IO 명령입니다

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

int main() { 

    char line[1024]; 
    FILE *fp = fopen("/Users/me/Desktop/output.txt","r"); 

    printf("Starting.. \n"); 

    int count = 0; 
    int list[30]; //items will be stored here 

    while(fgets(line, 1024, fp) != NULL){ 
     count++; 
     //char line[1024] = "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4],"; 
     size_t len = strlen(line); 
     memmove(line, line+1, len-4); 
     line[len-4] = 0; 
     printf("%s \n",line); 

     char *s = str, *t = NULL; 

     strcpy(str, line); 
     while ((t = strtok(s, " ,")) != NULL) { 
      s = NULL; 
      printf(":%s:\n", t); 
     } 
    } 
    printf(" num of lines is %i \n", count); 
    return 0; 
} 

일식 출력 (모든 while 루프 내에서 동일한 위와 같이있다) 내가 뭘 잘못하고 있는지 알아 내려고. 그게 도움이된다면 gcc 4.2와 함께 mac을 사용하고 있습니다. 내가 생각할 수있는 유일한 것은 나중에 목록 변수를 구문 분석하는 방식으로 잘못된 것을하고있을 가능성이 있기 때문입니다. 나중에 액세스 할 수 없으므로 (나는 그럴듯한 추측을하지 못합니다). 제가 빠진 것이 있습니까?

편집 : 내가 코드 블록을 주석하는 경우, 파일 통과 (그러나 구문 분석하지 않습니다) :

파일의 내용은 기본적으로 :

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 4], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 2, 4], 

등등 (20 + gb의).

EDIT2 : 내 Mac과 함께 있었는지 테스트 해보고 싶었고 centos 5 (테스트를 위해 설치 한 것)에서 시도해 보았습니다. 끝 부분에서 명령 줄에서 실행할 때와 동일한 오류가 발생했습니다. Segmentation fault. 위 예제 출력을 파일에 복사 한 다음 위의 코드에서 경로를 변경하고 실행했습니다.

+0

당신의'memmove' 것은 합리적인 아무것도하지 않는 것, 당신은 왜 직접'line'을 정의하지 않습니다 당신이 원하는 내용으로? –

+0

@JensGustedt 무슨 뜻인지 모르겠지만 파일 자체를 생성하지는 않습니다. 그래서 나를 위해 유용한 형식으로 그것을 얻기 위해 변수 라인을 구문 분석해야합니다. –

+0

'line'은'str'에 복사되지만,'line'은'1024' 문자보다 클 수 있습니다. 복사를하는 대신 줄에's'을 가리 키지 않는 이유는 무엇입니까? – hmjd

답변

3

알았습니다. 다른 포함과 함께 #include <string.h>을 삽입 해보십시오. 나는 왜 당신이 그것을 포함하지 않고 <string.h> 함수를 사용하고 있었는지 모르지만 잘못된 연결을 야기했다. 컴파일러에서 다음 경고를 보냈습니다.

test2.c:17: warning: incompatible implicit declaration of built-in function ‘strlen’ 
test2.c:18: warning: incompatible implicit declaration of built-in function ‘memmove’ 
test2.c:24: warning: incompatible implicit declaration of built-in function ‘strcpy’ 
test2.c:25: warning: assignment makes pointer from integer without a cast 

처음 세 경고는 헤더 파일을 포함하지 않았 음을 나타냅니다. 마지막 것은 선언없이 함수가 정수를 취하고 반환한다고 가정하는 것입니다 (이것은 고대 C 코드와의 하위 호환성을위한 것입니다).

fgets에는 줄 끝 부분에 줄 바꿈 문자가 포함됩니다. len-3len-4으로 변경하여 계정을 조정해야합니다.

또한 완료하면 파일을 fclose 잊지 마세요. 두 번째 문자로 단지를 가리킬 수 있습니다으로

또한, 당신의 memmove를가 불필요 :

char *moved_line = line + 1; 
+0

내 코드가 ... 내 파일이 줄 바꿈을 추가했기 때문에 생각했다.하지만 fgets와 관련되어 있음을 알기에 재미있다. –

+0

@ Error_404'fgets'는 한 줄에 파일의 줄을 가져옵니다. newline은 개행 문자를 포함합니다. – Matt

+0

ahhh 너의 천재 야! 고마워,하지만 또 다른 질문으로 너를 괴롭힐거야. 내가 어떻게 이런 바보 같은 실수를 막을 수있어? (뇌 이식을받는 것 말고)? 나는 불평 할 의도는 없지만 Java/python (정확하게 실수를하고 있다고 가정 함)과 달리 바보 같은 일을 할 때는 매우 장황하지 않습니다. –

4

여기에 line이라는 두 개의 선언이 있습니다. 하나는 main() 바로 뒤에 있고, 하나는 while 직후입니다. fgets은 첫 번째 line 변수를 읽습니다. while 블록 내에서 두 번째 line 선언은 첫 번째 마스크를 마스킹합니다 (두 번째 매크로가 더 로컬이기 때문에). 변수 fgets이 읽는 바깥 쪽 line 바깥 쪽 변수는 프로그램의 다른 곳에서는 액세스되지 않습니다.

+0

미안하지만, 주석을 달고 그것을 다시 작성했지만 여전히 동일한 결과물을 얻었습니다. 내 코드에 –

관련 문제