2014-12-15 4 views
-3

이번이 처음입니다. 저는 Gaddis의 책 "C++로 시작하기"에서 C++을 배우고 있습니다. 그러므로 누가 물어야할지 모르겠다. 그러면 나는이 웹 사이트를 발견했다. 당신이 나를 도우 려하지 않기를 바라며, 나는 당신에게서 많은 것을 배울 것입니다.출력에 어떤 문제가 있습니까?

쓰기 arrayToFile라는 함수 :

다음은이 책에서 한 문제입니다. 이 함수는 세 개의 인수를 받아 들여야합니다 : le의 이름, int 배열에 대한 포인터 및 배열의 ​​크기. 함수는 이진 모드에서 지정된 파일을 열고 배열의 내용을 파일에 쓰고 파일을 닫아야합니다. fileToArray라는 다른 함수를 작성하십시오. 이 함수는 세 개의 인수를 받아 들여야합니다 : le의 이름, int 배열의 포인터, 배열의 크기. 함수는 지정된 형식을 이진 모드로 열어 내용을 배열 에서 읽은 다음 파일을 닫아야합니다. arrayToFile 함수를 사용하여 배열에 파일을 쓰고 fileToArray 함수를 사용하여 동일한 파일의 데이터를 으로 읽음으로써 이러한 함수를 설명하는 전체 프로그램을 작성하십시오. 파일에서 데이터를 읽어 어레이에 넣은 다음 화면에 배열 내용을 으로 표시합니다. 여기

그리고

내 코드입니다 :

# include <iostream> 
# include <string> 
# include <fstream> 


using namespace std; 

const int SIZE = 10; 
bool arrayToFile(fstream&, int*, int); 
bool fileToArray(fstream&, int*, int); 

int main() 
{ 
    int arr[SIZE] = { 10, 8, 9, 7, 6, 4, 5, 3, 2, 1 }, 
     arrTest[SIZE]; 

    fstream file; 

    if (arrayToFile(file, arr, SIZE)) 
    { 
     if (fileToArray(file, arr, SIZE)) 
     { 
      for (int n = 0; n < SIZE; n++) 
      { 
       cout << arrTest[n] << " "; 
      } 

      cout << endl; 
      return 0; 
     } 
    } 


    return 1; 


} 

bool fileToArray(fstream &file, int* a, int size) 
{ 

    file.open("t.dat", ios::in | ios::binary); 
    if (!file) 
    { 
     cout << "Can't open file t.dat\n"; 
     return false; 
    } 


    file.read((char*)a, size); 
    file.close(); 

    return true; 

} 

bool arrayToFile(fstream &file, int* a, int size) 
{ 
    file.open("t.dat", ios::out | ios::binary); 
    if (!file) 
    { 
     cout << "Can't open file t.dat\n"; 
     return false; 
    } 

    file.write((char*)a, size); 
    file.close(); 

    return true; 
} 

그리고 여기에 출력됩니다 : -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -85 8,993,460 -858993460 -858993460

출력이 다음과 같이되어 있기 때문에 나는 무엇이 잘못되었는지 알지 못합니다. 10 8 9 7 6 4 5 3 2 1

당신의 도움에 감사드립니다.

+0

-858993460 = 0xCCCCCCCCCC는 특수한 Microsoft 디버그 코드입니다. 초기화되지 않은 스택 메모리를 의미합니다. http://stackoverflow.com/a/127404/487892. arrTest를 초기화하지 않은 코드를 살펴보십시오. – drescherjm

+0

'read'와'write'에 대한 문서를 읽어 들여 각각의 인수가 전달한 것에주의를 기울이십시오. 그런 다음 실제로 어떻게 사용하고 있는지 살펴보십시오. –

+0

당신은 arr에있는 것과 비교 했습니까? –

답변

0
file.write((char*)a, size); 

size 바이트를 파일에 기록합니다.

file.read((char*)a, size); 

은 파일에 size 바이트를 읽습니다.

size으로 사용하고 있습니다. 당신은 단지 10 바이트의 데이터를 쓰고 읽고 있습니다.

file.write((char*)a, size*sizeof(int)); 

file.read((char*)a, size*sizeof(int)); 

그리고 오른쪽 인자를 사용하여 fileToArray 전화 : 당신은에 그 라인을 변경해야합니다. 그 대신없이

if (fileToArray(file, arr, SIZE)) 

사용

if (fileToArray(file, arrTest, SIZE)) 

의, arrTest는 초기화되지 않은 배열 남아있다.

+0

도와 주셔서 감사합니다. 매우 자세합니다. 나는 왜 내가 마지막 실수를했는지 모르겠다. 정말 도움이됩니다. –

+0

@MinhLe, 우리 중 대부분은 이러한 간단한 오류를 처리했습니다. 내가 도울 수있어서 기뻐. –

0

나는 당신이 char 크기의 sizeof(char) 바이트 것을 이해한다, 시작하기 전에 및 int 일반적으로 1 바이트와 4 바이트 각각입니다 크기 sizeof(int) 바이트이다. 즉, 4 char이 1을 구성 할 수 있습니다. int. 당신이 file.write((char*)a, size); 보면

지금, 당신은 achar 등의 데이터가 아닌 int의보고 의미 char*int* 변환된다.

몇 가지 간단한 수학을 수행하면 10 int의 배열 크기는 10 * 4 = 40 바이트입니다. 그러나 파일에 쓰는 데이터의 양은 10-이며 10 바이트입니다.

다음으로 파일에 arr을 쓰려고 시도하고 파일에서 다시 arr으로 읽습니다. 나는 당신이 arrTest으로 읽고 싶어한다고 가정하지만, 그렇게하지 못했다면, arrTest의 내용에 접근하려고하면 볼 수있는 결과물을 얻게 될 것입니다. 나머지 커뮤니티에 의해 설명되는 것은 초기화되지 않은 메모리입니다. arrTest[SIZE]SIZE의 배열을 정의하지만 그 안에있는 메모리는 초기화되지 않기 때문입니다.

요약하면 현재 출력의 원인은 프로그램 논리의 문제로 인한 것이며 readwrite의 잘못된 사용은 잠재적 인 문제를 일으킬 수 있습니다.

읽어 주셔서 감사합니다.

+0

'int'는'sizeof (int)'바이트입니다. –

+0

코멘트 해 주셔서 감사합니다. 나는 그 점을 더 분명히 할 것이다. – Nard

+0

대단히 감사합니다. 그것은 교과서에 있지만 크기가 다른 것을 완전히 잊어 버렸습니다. 정말 도움이됩니다. –