流中的随机数、符号、字符 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;
}