将奇怪的符号打印到输出文件,C++
printing weird symbols to output file, 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
数组中。只需按如下方式更新您的代码即可。
infile.open(file_nameI);
if (!infile){
cout << "Could not open input file \n";
return 0;
} else{
i = 0;
while (infile >> num[i]){
i++;
}
}
您的代码存在的问题已在评论中提及,但再次提及:
- 第一个问题是
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;
}
我正在编写一个代码来读取数字的输入文件,按升序对它们进行排序,并将它们打印到输出。唯一打印输出的是一些非常奇怪的符号。
这是我的代码
#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
数组中。只需按如下方式更新您的代码即可。
infile.open(file_nameI);
if (!infile){
cout << "Could not open input file \n";
return 0;
} else{
i = 0;
while (infile >> num[i]){
i++;
}
}
您的代码存在的问题已在评论中提及,但再次提及:
- 第一个问题是
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;
}