将奇怪的符号打印到输出文件,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

解决方法:

您的代码问题已经在评论中提到但是又一次:

>第一个问题是num [20]的未初始化元素 – num的元素具有不确定的值,因此访问它们中的任何一个都会触发未定义的行为.您应该首先从文件中读取它们,或者至少将它们初始化为某个默认值.
>应该最有可能进行排序的代码部分完全错误.如果您想要实现自己的排序功能,可以选择一些众所周知的算法,例如: quicksort – 但C标准库已经提供了排序功能 – std :: sort.

除了明显的错误:

>你正在使用char [] – 在C中使用std :: string几乎总是更好.
>您的静态数组只能存储20个值,而您正在从文件中读取这些值.您可以使用std :: vector,当您添加的元素多于其当前容量时,它可以增长.它还使用num [20]的未初始化元素自动修复问题.
>如评论中所述,您可以通过将代码拆分为函数来组织代码并提高可读性.

在这里你很快就重写了.此代码使用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;
}
上一篇:c – Visual Studio 2012升级后出现“无符号模块构建”错误


下一篇:Android studio无法解析ActionBarActivity