流中的随机数、符号、字符 C/C++
Random numbers, Symbols, Characters, in a stream C/C++
大家好,我是新来的,也是 c/c++ 的新手,我通常不练习流,但是当我尝试制作流时,打开使用此代码创建的文件,我总是得到随机数、字符、符号和垃圾在创建的 .txt 文件中。
像这样:
Hellothere.txt。我看到随机符号,输入的是字符而不是数字,名字还可以,因为它显示得很好,但有时当我写长名字时,它会写成垃圾。
你能帮我解决这个问题吗?代码如下:
struct sample {
int code;
char name [20];
} sampl;
int main () {
cout<<" ENTER CODE : "<<endl;
cin>>sampl.code;
cout<<" ENTER NAME :"<<endl;
gets(sampl.name);
fflush(stdin);
FILE *fp;
fp=fopen("Hellothere.txt", "rb+");
if(fp==NULL) {
fp=fopen("Hellothere.txt","wb+");
if(fp==NULL) {
puts("CANNOT OPEN");
return 0;
}
}
fwrite(&sampl,sizeof(sampl),1,fp);
fclose(fp);
getchar();
}
您正在混合使用 C++ 和较旧的 C 工具进行输入和输出。如果你坚持只使用 C++,你会过得更轻松。
首先,让我们用 C++ 等效项替换您的结构:
struct sample {
int code;
std::string name;
};
现在 name
可以容纳任意数量的字符。
我们现在将编写一个函数,它将 sample
输出到 C++ 输出流:
std::ostream& write_sample(std::ostream& os, const sample& samp)
{
os << samp.code << "\n" << samp.name;
return os;
}
这将输出代码后跟名称,它们之间有一个换行符。
现在让我们修改您的 main()
例程以使用 C++ 工具来填充结构:
int main()
{
sample samp;
cout << "ENTER CODE :\n";
cin >> samp.code;
cost << "ENTER NAME :\n";
cin >> samp.name;
}
现在,我们可以通过将 write_sample()
函数与 std::cout
一起使用来快速检查我们是否做对了,这是一种输出流:
write_sample(std::cout, samp);
这应该会重复您在控制台中输入的内容。
要改为写入文件,我们可以使用 C++ 工具打开文件流:
std::ofstream outfile{"Hellothere.txt"};
现在,我们可以再次将 write_sample()
函数用于此新流:
write_sample(outfile, samp);
当您的程序运行时,Hellothere.txt 应该包含您输入的文本。
作为最后(稍微高级一点),您可能需要将 write_sample()
函数重命名为 operator<<
,这将允许您使用标准的 <<
流式传输样式:
outfile << samp;
把它们放在一起,最终的代码应该是这样的:
#include <fstream>
#include <iostream>
#include <string>
struct sample {
int code;
std::string name;
};
std::ostream& operator<<(std::ostream& os, const sample& samp)
{
return os << samp.code << "\n" << samp.name;
}
int main()
{
using namespace std;
sample samp;
cout << "Enter code:\n";
cin >> samp.code;
cout << "Enter name:\n";
cin >> samp.name;
std::ofstream outfile{"Hellothere.txt"};
outfile << samp;
}
大家好,我是新来的,也是 c/c++ 的新手,我通常不练习流,但是当我尝试制作流时,打开使用此代码创建的文件,我总是得到随机数、字符、符号和垃圾在创建的 .txt 文件中。 像这样: Hellothere.txt。我看到随机符号,输入的是字符而不是数字,名字还可以,因为它显示得很好,但有时当我写长名字时,它会写成垃圾。
你能帮我解决这个问题吗?代码如下:
struct sample {
int code;
char name [20];
} sampl;
int main () {
cout<<" ENTER CODE : "<<endl;
cin>>sampl.code;
cout<<" ENTER NAME :"<<endl;
gets(sampl.name);
fflush(stdin);
FILE *fp;
fp=fopen("Hellothere.txt", "rb+");
if(fp==NULL) {
fp=fopen("Hellothere.txt","wb+");
if(fp==NULL) {
puts("CANNOT OPEN");
return 0;
}
}
fwrite(&sampl,sizeof(sampl),1,fp);
fclose(fp);
getchar();
}
您正在混合使用 C++ 和较旧的 C 工具进行输入和输出。如果你坚持只使用 C++,你会过得更轻松。
首先,让我们用 C++ 等效项替换您的结构:
struct sample {
int code;
std::string name;
};
现在 name
可以容纳任意数量的字符。
我们现在将编写一个函数,它将 sample
输出到 C++ 输出流:
std::ostream& write_sample(std::ostream& os, const sample& samp)
{
os << samp.code << "\n" << samp.name;
return os;
}
这将输出代码后跟名称,它们之间有一个换行符。
现在让我们修改您的 main()
例程以使用 C++ 工具来填充结构:
int main()
{
sample samp;
cout << "ENTER CODE :\n";
cin >> samp.code;
cost << "ENTER NAME :\n";
cin >> samp.name;
}
现在,我们可以通过将 write_sample()
函数与 std::cout
一起使用来快速检查我们是否做对了,这是一种输出流:
write_sample(std::cout, samp);
这应该会重复您在控制台中输入的内容。
要改为写入文件,我们可以使用 C++ 工具打开文件流:
std::ofstream outfile{"Hellothere.txt"};
现在,我们可以再次将 write_sample()
函数用于此新流:
write_sample(outfile, samp);
当您的程序运行时,Hellothere.txt 应该包含您输入的文本。
作为最后(稍微高级一点),您可能需要将 write_sample()
函数重命名为 operator<<
,这将允许您使用标准的 <<
流式传输样式:
outfile << samp;
把它们放在一起,最终的代码应该是这样的:
#include <fstream>
#include <iostream>
#include <string>
struct sample {
int code;
std::string name;
};
std::ostream& operator<<(std::ostream& os, const sample& samp)
{
return os << samp.code << "\n" << samp.name;
}
int main()
{
using namespace std;
sample samp;
cout << "Enter code:\n";
cin >> samp.code;
cout << "Enter name:\n";
cin >> samp.name;
std::ofstream outfile{"Hellothere.txt"};
outfile << samp;
}