2017-03-03 85 views
1

這是一個程序,它將讀取輸入文件中的數字並將它們放入數組中,然後按升序對它們進行排序並將它們打印到輸出文件中。從函數reset返回的變量

編譯時沒有錯誤,但程序運行時它會正確計數文件中的數字個數並存儲它們,直到numsize返回到郵件函數爲零。

我測試了這個循環打印什麼numsize是每次,它不是直到main()函數時,它變回零。

我唯一的猜測是,我無法正常返回變量,或者也許不正確,宣佈它

int store (int arg[20], int numsize, istream& infile) 
{ 
    numsize = 0; 
    if(numsize<20) 
    { 
    infile >> arg[numsize]; 
    } 
    while(!infile.eof()) 
    { 
    numsize++; 
    if(numsize<20) 
    { 
     cout << numsize; 
     infile >> arg[numsize]; 
    } 
    } 
    return numsize; 
} 

int printarray (int arg[20], int numsize, ostream& outfile) 
{ 
    for (int i = 0; i<= numsize; i++) 
    { 
    outfile << arg[i] << endl; 
    }  
    return 0; 
} 

int main() 
{ 
    int arg[20]; 
    int numsize; 

    std::string input_filename, output_filename; 
    ofstream out_file; 
    ifstream in_file; 

    cout << "Please enter name of input file: "; 
    cin >> input_filename; 
    in_file.open(input_filename.c_str()); 
    if (!in_file) 
    { 
    cout << "Could not open input file\n"; 
    return 0; 
    } 

    cout << "Please enter name of output file: "; 
    cin >> output_filename; 
    out_file.open(output_filename.c_str()); 
    if (!out_file) 
    { 
    cout << "Could not open output file\n"; 
    return 0; 
    } 

    store(arg, numsize, in_file); 
    cout << numsize << "numbers were read from the input file" << endl; 
    printarray(arg, numsize, out_file); 

    return 0; 
} 
+1

'numsize = 0; if(numsize <20)'?另外,如果這個if不能通過,你的循環在讀取任何東西之前增加'numsize',這意味着你的數組的第一個元素是未初始化的。最後,你的['while(!eof())'是錯誤的。](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)。你永遠不會確保整數被實際讀取。 – chris

回答

2

至少有兩種方法修復它:

1)如果你不想允許功能通過這條線

numsize = store(arg, numsize, in_file); 

2)您也可以只需更換這行

int store (int arg[20], int numsize, istream& infile) 

:,以改變它的第二個參數,只需更換這行:此行

store(arg, numsize, in_file); 

int store (int arg[20], int& numsize, istream& infile) 

(在此c ASE你的函數store()就能改變數值numsize

而且我建議你改變功能store()這樣:

int store (int arg[20], istream& infile) 
{ 
    int numsize = 0; 
    while((numsize<20) && (infile >> arg[numsize])) 
    { 
    numsize++; 
    cout << numsize; 
    } 
    return numsize; 
} 

,並呼籲這樣說:

numsize = store(arg, in_file); 
2

您需要通過引用store()通過numsize
變化

int store (int arg[20], int numsize, istream& infile) 

int store (int arg[20], int& numsize, istream& infile) 

此外,要麼改變store()返回類型void,或者從它返回一個int(即numsize?)

3

由於numsize是按值傳遞的,因此在退出時丟棄store內的任何修改。您需要將返回值賦給回numsize

numsize = store(arg, numsize, in_file); 

注:你在你的store功能使用numsize就好像它是一個局部變量,因爲你爲它分配零的時候了。千萬不要錯過它在所有:

int store (int arg[20], istream& infile) { 
    int numsize = 0; 
    while(numsize < 20 && (infile >> arg[numsize])) { 
     numsize++; 
     cout << numsize; 
    } 
    return numsize; 
} 

也不要使用infile.eof(),這是一個不正確的使用模式

2

你應該寫至少像

numsize = store(arg, numsize, in_file); 

這將是更正確的聲明功能如

size_t store (int arg[], size_t n, istream& infile); 

其中參數n表示數組中元素的數量。否則該函數將取決於魔法未知數字20.

此外,函數中的循環不正確。該函數可以將最後一個數字放入數組中,因爲在將數字存儲在數組中之後檢查條件eof

功能的實現可以像

size_t store(int arg[], size_t n, istream& infile) 
{ 
    size_t i = 0; 
    int value; 

    while(i < n && infile >> value) arg[i++] = value; 

    return i; 
} 

,並呼籲像

size_t numsize; 

//... 

numsize = store(arg, sizeof(arg)/sizeof(*arg), in_file); 

相應功能printarray應該像

void printarray(int arg[], size_t numsize, ostream& outfile) 
{ 
    for (size_t i = 0; i < numsize; i++) 
         ^^^^^^^^^^^ 
    { 
     outfile << arg[i] << endl; 
    }  
} 
2

當你調用在store功能定義主要功能,然後嘗試從函數store保存返回的變量numsize的值。您可以嘗試以下代碼:

numsize = store(arg, numsize, in_file);