我在输入函数上做错了什么
What am I doing wrong with the input function?
所以对于我的第二个C++类,我们必须编写一个程序来创建 5 个结构和一个类的数组。结构中是一个 int、一个包含 5 个双精度的数组和一个包含 81 个元素的字符数组。当然,其中一个功能是从用户那里获取信息。该函数称为setStructData():
void Prog1Class::setStructData()
{
for(int i=0; i<5; i++)
{
cout<<"input an integer, five doubles, and a character array up to 80 characters."<<endl;
cin>>StructArray[i].m_iVal;
for(int j=0; j<5; j++)
{
cin>>StructArray[i].m_dArray[j];
}
cin.ignore('n');
cin>>StructArray[i].m_sLine;
cout<<"String entered: "<<StructArray[i].m_sLine<<endl;
}
}
下一个函数 getStructData() 是获取结构数组中的每个元素,并将一行上的元素、下一行的下一个元素等,依此类推,直到数组上的所有 5 个元素都显示出来。这是我所拥有的:
void Prog1Class::getStructData(int index, Prog1Struct *struct_ptr)
{
struct_ptr=&StructArray[index];
cout<<struct_ptr->m_iVal<<" ";
for(int i=0; i<5; i++)
{
cout<<struct_ptr->m_dArray[i]<<" ";
}
cout<<struct_ptr->m_sLine<<endl;
}
当我通过键盘输入(在一行上输入结构数组中的每个元素)时,这个程序工作,但我的教授给了我们一个我们应该使用的文本文件测试.txt它看起来像这样(字符数组与其他字符数组在不同的行上):
10 1.2 2.3 3.4 4.5 5.6
Test string 1
20 2.3 3.4 4.5 5.6 6.7
Test string 2
30 3.4 4.5 5.6 6.7 7.8
Test string 3
40 4.5 5.6 6.7 7.8 8.9
Test string 4
50 5.6 6.7 7.8 8.9 9.1
Test string 5
它的文本文件搞砸了我的程序,因为它的字符数组在完全不同的行上。我相信这只是我输入数据的方式,但我不知道如何解决它。有人可以帮助我吗?当我使用 I/O 重定向来使用 test.txt 文件输入我的数据时,我让它输出回第一行(没有字符串),然后剩下的就是一堆疯狂的垃圾。请帮助我!
首先,您应该始终验证您的输入是否成功!也就是说,在读取后始终检查流是否仍处于良好状态,例如:
if (!(std::cin >> StructArray[i].m_dArray[j])) {
std::cout << "failed to read double valuen";
}
接下来,当使用格式化的输入到字符数组中时,您应该始终首先设置宽度!如果不设置宽度,您可以在程序中创建一个可能被黑客入侵的攻击媒介(这可能与您的家庭作业无关紧要,但一旦您创建了专业软件,它很可能很重要):
if (!(std::cin >> std::setw(sizeof(StructArray[i].m_sLine)) >> StructArray[i].m_sLine)) {
std::cout << "failed to read stringn";
}
但请注意,格式化输入始终在第一个空格字符处停止读取。文件中的输入似乎包含Test string
形式的字符串,这将导致Test
被读取,string
留在流中以供下一项读取。您可以使用getline()
读取所有输入,直到行尾。但是,由于所有格式化的输入操作都倾向于在流中留下空格字符,例如数字后的换行符,因此您可能应该读取前导空格。例如,您可以使用
if (!(std::cin >> std::ws).getline(StructArray[i].m_sLine, sizeof(StructArray[i].m_sLine)) {
...
}
就个人而言,我更喜欢使用std::getline(std::cin >> std::ws, str)
,第二个参数是 std::string
类型,但似乎您的赋值不允许使用 std::string
类。操纵器std::ws
读取所有前导空格。
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 我的C++线程做错了什么?
- 谁能告诉我我用 getline 做错了什么 (cpp) 格式
- 没有输出的合并排序我做错了什么?
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 在C++中使用 AKS 素数测试计算双胞胎素数 我做错了什么?
- 我一直试图弄清楚我在这个链表程序中做错了什么
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- FFMPEG,C++,内存泄漏,我做错了什么?
- 我做错了什么?反向字符串 C++
- 我在这个课上做错了什么?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 我做错了什么?GetDiskFreeSpaceExA的功能根本不起作用
- 我在查找和字符串上做错了什么?
- 我正在尝试用 c++ 制作一个日志记录框架,但信息没有传递给记录器的子组件,我做错了什么?
- 我在尝试将多个值push_back向量时出错。我做错了什么?
- 插入排序:我做错了什么?