저는 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
. 위 예제 출력을 파일에 복사 한 다음 위의 코드에서 경로를 변경하고 실행했습니다.
당신의'memmove' 것은 합리적인 아무것도하지 않는 것, 당신은 왜 직접'line'을 정의하지 않습니다 당신이 원하는 내용으로? –
@JensGustedt 무슨 뜻인지 모르겠지만 파일 자체를 생성하지는 않습니다. 그래서 나를 위해 유용한 형식으로 그것을 얻기 위해 변수 라인을 구문 분석해야합니다. –
'line'은'str'에 복사되지만,'line'은'1024' 문자보다 클 수 있습니다. 복사를하는 대신 줄에's'을 가리 키지 않는 이유는 무엇입니까? – hmjd