2014-04-12 4 views
0

그 일은 내가 이미 통과 한 게임의 레벨을 알기 위해 정수를 읽으려는 것이고, 그렇다면 현재 레벨의 정수를 1에 넣고 싶습니다. 아직 아니야. 파일을 만들지 만 아무것도 쓰지 않습니다. 왜 그런지 알아? 이제는 printf로 처음 만들었지 만 읽기 만하면 상태 액세스 위반이 발생합니다.정수를 파일에 쓰고 읽는 법

void SaveGame(void) 
{ 
    FILE *pFile = fopen("SavedData.txt","rb"); 
    int MyArray[8] = {0}; 

    if(pFile) 
    { 
    fscanf(pFile, "%d %d %d %d %d %d %d %d" , MyArray[0], MyArray[1], MyArray[2], MyArray[3], MyArray[4], MyArray[5], MyArray[6], MyArray[7]); 
    fclose(pFile); 
    } 

    if(MyArray[Current] == 0) 
    MyArray[Current] = 1; 

    pFile = fopen("SavedData.txt", "wb"); 

    if(pFile) 
    { 
    fprintf(pFile, "%d %d %d %d %d %d %d %d" , MyArray[0], MyArray[1], MyArray[2], MyArray[3], MyArray[4], MyArray[5], MyArray[6], MyArray[7]); 
    fclose(pFile); 
    } 
} 
+0

'if (MyArray [Current] = 0)''=='를 사용해야합니다. –

+0

파일 핸들을'feof' ...로 전달해야합니다. feof (pFile);' –

+0

당신의 쓰기 루프는 무한합니다. 즉, 파일이 어디에서 끝나는 지 결정하는 것은 당신에게 달려 있습니다. – ooga

답변

0

당신은이 (테스트되지 않은) 같은 것을 원하는 것을 할 수 있습니다

#define SAVE_FILE "SavedData.txt" 
#define NUMS_SIZE 8 

void SaveGame() { 
    FILE *f; 

    f = fopen(SAVE_FILE, "r"); 
    if (!f) { 
    fprintf(stderr, "Error: Can't open save file for reading.\n"); 
    exit(-1); 
    } 

    int nums[NUMS_SIZE] = {0}; 
    int n, i = 0; 
    while (fscanf(f, "%d", &n) == 1) { 
    if (i >= NUMS_SIZE) break; 
    nums[i++] = n; 
    } 
    fclose(f); 

    f = fopen(SAVE_FILE, "w"); 
    if (!f) { 
    fprintf(stderr, "Error: Can't open save file for writing.\n"); 
    exit(-1); 
    } 
    int j = 0; 
    if (i > 0) fprintf("%d", nums[0]); 
    for (j = 1; j < i; ++j) 
    fprintf(" %d", nums[j]); 
    fclose(f); 
} 
+0

멋지다, 고마워. – user3239445

+0

출력 루프는 'NUMS_SIZE'가 아니라'i'의 이전 값으로 끝나야한다. 입력 루프는'nums '의 범위를 오버플로하기 전에 중지되어야합니다. –

+0

@MattMcNabb 동의 함. 업데이트 됨. 그것이 실제로 OP가 그것을 원하는 방법에 달려 있지만. 파일에 8 개의 0이 있다고 상상했지만 확인하는 것이 가장 좋습니다. – ooga

0

을 당신이 파일을 읽을 방법 아니에요.

텍스트 파일 인 경우 먼저 "r"이 아니고 "rb"이 아닌 모드로 열어야합니다.

읽기 작업을 수행 할 때 읽기 작업이 성공했는지 실패했는지 확인해야합니다. 대신 feof을하지 마십시오. 밖에있는 많은 코드가 feof이고 대부분이 잘못되었습니다. 인터넷 코드 샘플을 복사 할 때 조심하십시오.

또한 사용하는 표준 기능에 대한 설명서를 읽는 것이 좋습니다. 모르는 기능에 대해 배울 수 있습니다. 예를 들어, fscanf은 성공적으로 읽은 항목 수를 반환합니다.

읽기 루프에서 fscanf이 8을 반환하는지 확인하거나 ooga가 제안한대로 8 회 반복하여 매번 1을 확인합니다. 루프 중에 feof을 확인하지 마십시오.

일단 읽기가 실패하면 feof을 수행하여 알고있는 경우 읽지 못한 이유를 알아낼 수 있습니다. 파일 (feof)의 끝이나 장치 오류 (ferror)로 인해 또는 파일에 숫자 대신 단어가 있기 때문에 실패 할 수 있습니다.

글쓰기 부분을 작성할 때 성공적으로 읽은 숫자 만 쓰십시오.

관련 문제