2017-02-28 42 views
3

我寫讀取數字的輸入文件,進行升序排序它們,並把它們打印輸出的代碼。打印輸出的唯一東西是一些非常怪異的符號。印刷怪異符號輸出文件,C++

這裏是我的代碼

#include <fstream> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    int i, y, temp, num[20]; 
    char file_nameI[21], file_nameO[21]; 
    ofstream outfile; 
    ifstream infile; 

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

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

    for (i = 0; i < 20; i++) 
    { 
     y = i + 1; 
     while (y < 5) 
     { 
      if (num[i] > num[y])  //Correction3 
      { 
       infile >> temp; 
       temp = num[i]; 
       num[i] = num[y]; 
       num[y] = temp; 
       //y++;   //Correction4 
      } 
      y++; 
     } 
    } 

    for (i = 0; i < 5; i++) 
     outfile << "num[i]:" << num[i] << "\n"; 

    return 0; 
} 

這裏是我的輸入

6 7 9 0 40 

這裏是輸出

 „Ô,üþ 54 
H|À°ÀzY „Ô,üþ 0 
+0

使用調試器。進入你的循環時'num'的元素是什麼? – mpiatek

+0

輸出至少應包含「num [i]」。根據Occam的Razor的說法,你聲稱不是這個事實表明這不是你正在使用的實際代碼,或者你正在查看錯誤的文件。此外,由於顯示的代碼顯然使用未初始化的變量,因此這已經是未定義的行爲,並且所有投注都關閉。學習如何使用調試器,並逐個執行代碼,檢查所有變量的值。 –

+0

你真的應該拆分排序和文件操作。將文件讀入數組,對數組進行排序,然後輸出。這使得這個問題變得更容易。 – NathanOliver

回答

4

與您的代碼問題的意見,但再次被已經提到:

  1. 第一個問題是num[20]未初始化的元素 - 的num元素具有不定值所以訪問其中的任何觸發未定義行爲。您應該先從文件中讀取它們,或者至少將它們初始化爲默認值。
  2. 應該最有可能做排序的代碼部分是完全錯誤的。如果你想實現你自己的分類功能,你可以選擇一些衆所周知的算法,如quicksort - 但C++標準庫已經提供了排序功能 - std::sort

除了明顯的錯誤:

  1. 您正在使用char[] - 在C++中它幾乎總是最好使用std::string
  2. 您的靜態數組只能存儲20個值,並且您正在從文件中讀取這些值。您可以使用std::vector,當您添加比當前容量更多的元素時,它可以增長。它還自動修復了num[20]未初始化元素的問題。
  3. 正如評論中提到的,您可以組織代碼並通過將代碼拆分爲函數來提高可讀性。

在這裏,你已經得到了它迅速改寫。該代碼使用std::string,而不是char[]std::vector存儲數字和std::sort。如果在這裏有些東西你不明白,請閱讀SO文檔:

#include <fstream> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
using namespace std; 

vector<int> read_file(ifstream& in_file) 
{ 
    vector<int> vec; 
    int value; 
    while (in_file >> value) 
    { 
     vec.push_back(value); 
    } 

    return vec; 
} 

void write_file(ofstream& out_file, const vector<int>& values) 
{ 
    for (size_t i = 0; i < values.size(); ++i) 
     out_file << "value #" << i << ": " << values[i] << '\n'; 
} 

int main() 
{ 
    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); 
    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); 
    if (!out_file) 
    { 
     cout << "Could not open output file\n"; 
     return 0; 
    } 

    auto numbers = read_file(in_file); 

    sort(begin(numbers), end(numbers)); 

    write_file(out_file, numbers); 

    return 0; 
} 
+0

這是一個很好的程序,但它並不完全顯示OP代碼有什麼問題。 –

+0

@ n.m。好的評論,更好的解釋。 – mpiatek

+0

@mpiatek gee我希望有一天我可以和你一樣編碼。感謝您的建議!我正在做這個課程,所以不幸的是,我不能使用你的絕大部分好建議,因爲我的教授希望我們以不必要的冗長和複雜的方式來做,或者他要求我們使用的編譯器無法識別新的和花哨的代碼。 – Morgan

1

你可能忘了在存儲陣列num值。只需更新您的代碼,如下所示,它將起作用。

infile.open(file_nameI); 
if (!infile){ 
    cout << "Could not open input file \n"; 
    return 0; 
} else{ 
    i = 0; 
    while (infile >> num[i]){ 
     i++; 
    } 
} 
+0

@Morgan如果我的答案幫助了你,你可以接受它。 –