【问题标题】:printing weird symbols to output file, c++将奇怪的符号打印到输出文件,C++
【发布时间】:2017-07-18 21:21:13
【问题描述】:

我正在编写一个读取数字输入文件的代码,按升序对它们进行排序,然后将它们打印到输出。唯一打印输出的是一些非常怪异的符号。

这是我的代码

#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 的元素是什么?
  • 输出至少应该在某处包含“num[i]”。根据 Occam's Razor 的说法,您声称它不是表明这不是您正在使用的实际代码,或者您正在查看错误的文件。此外,由于显示的代码显然使用了未初始化的变量,这已经是未定义的行为,所有的赌注都被取消了。了解如何使用调试器,一次一行地单步调试代码,检查所有变量的值。
  • 您确实应该将排序和文件操作分开。将文件读入数组,对数组进行排序,然后输出。这让这个问题变得容易多了。
  • 从一个读取数组然后打印回来的程序开始。当你做对了,添加排序。

标签: c++ symbols into-outfile


【解决方案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++;
    }
}

【讨论】:

  • @Morgan 如果我的回答对你有帮助,你可以接受。
【解决方案2】:

您的代码问题已经在 cmets 中提到过,但又一次:

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

除了明显的错误:

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

在这里,您可以快速重写它。此代码使用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;
}

【讨论】:

  • 这是一个不错的程序,但它并不能准确显示 OP 的代码有什么问题。
  • @mpiatek gee 我希望有一天我能像你一样编码。谢谢你的建议!我这样做是作为一项课堂作业,所以不幸的是,我不能使用你提出的大部分很酷的建议,因为要么我的教授希望我们以不必要的冗长和复杂的方式去做,要么他要求我们使用的编译器无法识别新奇的代码。
  • @Morgan 欢迎访问该网站。我想说 1) 如果您的教授不赞成在 C++ 程序中使用 stringvectorsort()(注意:不是 C),我认为您的教授很糟糕,应该逃跑; 2) 如果您使用过去 15 年左右的任何 C++ 编译器(同样,不是 C!),则支持这些; 3)如果你认为这个答案是你在问题中提出的问题的最佳解决方案,你应该接受它。由于原始问题中不存在的原因,您是否可以实际求助于它应该得到解决......
  • ... 在一个新问题中。
猜你喜欢
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多