2014-10-29 3 views
0
#include <iostream> 
#include <iomanip> 
#include <cstdlib> 
#include <fstream> 

using namespace std; 

void make_array(ifstream &num, int (&array)[50]); 

int main(){ 

ifstream file; // variable controlling the file 
char filename[100]; /// to handle calling the file name; 
int array[50]; 


cout << "Please enter the name of the file you wish to process:"; 
cin >> filename; 
cout << "\n"; 

file.open(filename); 

if(file.fail()){ 
cout << "The file failed to open.\n"; 
exit(1); 
} 

else{ 
cout << "File Opened Successfully.\n"; 
} 


make_array(file, array); 


file.close(); 

return(0); 

} 


void make_array(ifstream &num, int (&array)[50]){ 

int i = 0; // counter variable 

while(!num.eof() && i < 50){ 
num >> array[i]; 
i = i + 1; 
} 

for(i; i>=0; i--){ 
cout << array[i] << "\n"; 
} 


} 

좋아요,이 코드는 지금까지 제 코드입니다. 배열의 내용을 출력 할 때 예상되는 출력 전에 실제로 두 개의 큰 음수를 얻습니다. 예를 들어 파일에 1 2 3 4가 있으면 내 프로그램에서 -6438230 -293948 1 2 3 4를 출력하고 있습니다.배열의 출력이 잘못되었습니다.

누군가 내가 왜이 우스운 값을 얻고 있는지 말해 줄 수 있습니까?

+1

사람들이 100 자 이상의 파일 이름을 입력하지 못하도록하는 것은 무엇입니까? 'std :: string'을 사용하면 버퍼 오버 플로우를 유발하기 쉽습니다. 또한 배열 입력이 사용되기 전에 성공했는지 확인하지 않습니다. 또한 단계별로 프로그램을 디버깅해야합니다.이 시점에서 그 값의 출처를 확인해야합니다. 조건으로'eof'를 사용하면 [버그를 일으킬 수 있습니다] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) 또한 올바르게 수정합니다. 성공 문제에 대한 점검 입력을 수정합니다. – chris

답변

3

코드는 배열을 역방향으로 출력하고 모든 값을 읽은 후에도 i을 두 번 증가시킵니다. 이것이 처음부터 두 개의 쓰레기 값을 보는 이유입니다. 나는 당신이 당신의 산출물을 잘못보고 있다고 의심하고 실제로 -6438230 -293948 4 3 2 1을 보았다.

eof()의 사용이 잘못되어 추가 증분 현상이 발생합니다. 어떤 이유로 든 놀랍게도 일반적인 오류입니다. See here for further info. 대신이 같은 루프를 작성 :

while (i < 50 && num >> array[i]) 
    ++i; 

지금 i 목록에 유효한 항목의 수를 보유하고 있습니다. 당신이 실제로 뒤쪽으로 출력 할 하시겠습니까 가정하면 그들이 앞으로 당신이 두 개의 변수가 필요합니다 출력하려면

while (i-- > 0) 
    cout << array[i] << "\n"; 

+0

이 코드를 시도했지만 여전히 하나의 가비지 값을 얻고 있습니다. 그리고 그것은 첫 번째 값이므로 마지막 인덱싱 된 값이되어야합니다. 그러나 나는 왜 여분의 카운트를 얻고 있는지 보지 못합니다. – user2905256

0
(배열의 항목의 총 수를 저장하는 일을 한 것은 반복을 수행하는)

수표 !num.eof()은 읽은 마지막 것이 eof가 아님을 알려줍니다. 따라서 파일이 1 2 3 4 인 경우5num>>array[i] 호 이후에만 수표가 으로 시작됩니다. 그러나 i의 경우 array[i]은 의미없는 값으로 채워집니다. eof을 처리하는 유일한 올바른 방법은 operator>>에 대한 모든 호출에서 유효성을 검사하는 것입니다. 즉, 오른쪽 조건은 간단히 num>>array[i]입니다. 이것은 conversion에서 bool까지 C++ 11 이후부터 void* pre-C++ 11까지 사용합니다.

관련 문제