C ++ ifstream嵌套循环[关闭]
Posted
技术标签:
【中文标题】C ++ ifstream嵌套循环[关闭]【英文标题】:C++ ifstream nested loops [closed] 【发布时间】:2020-10-12 13:46:27 【问题描述】:我正在从事一个命理项目,我必须输入一个名称并添加分配给名称的每个字母的值。我已经使用循环遍历字符来处理单个单词。 我现在想通读一个列表并获得一个带有 name_value 的输出..
没有 while 循环或 ifstream 的代码。
#include <iostream>
#include <string>
using namespace std;
//struct for multiple data types
struct chaldean
string myword;
bool in_mychar(string test)
for (unsigned int strpos = 0; strpos < myword.length(); strpos++)
if (myword.substr(strpos, 1) == test)
return true;
return false;
;
//function declaration
int value(chaldean chl[], string& st);
int main()
string chaldstrings[8] = "aijqy", "bckr", "gls", "dmt", "en", "uvwx", "oz", "fhp" ;
chaldean chald[8];
string name 0 ;
int name_value 0 ;
cout << "Enter a name : ";
cin >> name;
for (int n = 0; n < 8; n++)
chald[n].myword = chaldstrings[n];
name_value = value(chald, name);
cout << name_value << endl;
return 0;
//function definition
int value(chaldean chl[], string& st)
int total = 0;
for (int n = 0; n < 8; n++)
for (unsigned int s = 0; s < st.length(); s++)
if (chl[n].in_mychar(st.substr(s, 1)))
total += n + 1;
return total;
虽然使用 fstream,但我无法让它在列表中运行。它只是没有从 names.txt 文件中获取值。它不会抛出任何错误。可能是一些愚蠢的东西。我不是能够弄清楚.. 使用ifstream的代码如下
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
//struct for multiple data types
struct chaldean
string myword;
bool in_mychar(string test)
for (unsigned int strpos = 0; strpos < myword.length(); strpos++)
if (myword.substr(strpos, 1) == test)
return true;
return false;
;
//function declaration
int value(chaldean chl[], string& st);
int main()
string chaldstrings[8] = "aijqy", "bckr", "gls", "dmt", "en", "uvwx", "oz", "fhp" ;
chaldean chald[8];
string name 0 ;
int name_value 0 ;
ifstream input_file("names.txt");
while (input_file >> name)
for (int n = 0; n < 8; n++)
chald[n].myword = chaldstrings[n];
name_value = value(chald, name);
cout << name_value << endl;
return 0;
//function definition
int value(chaldean chl[], string& st)
int total = 0;
for (int n = 0; n < 8; n++)
for (unsigned int s = 0; s < st.length(); s++)
if (chl[n].in_mychar(st.substr(s, 1)))
total += n + 1;
return total;
names.txt 是一个包含以下内容的文本文件
tom
sally
mary
它应该显示以下数字
15
11
8
The working of the output is as under
letters a,i,j,q,y have the value 1
letters b,c,k,e have the value 2
similarly all the alphabets are valued between 1 to 8
tom would mean t =4, o=7, and m=5.... therefore 4+7+4=15..
【问题讨论】:
你为什么使用chaldean
s的数组?只需改用std::vector
。
请将代码编辑为可读。
想想你的for
循环,它到底在做什么?它应该做什么?它真的需要为每一行输入运行吗?
我很抱歉..我是 C++ 新手..你说我正在尝试做的事情不适用于数组..或者只是向量更容易循环?
请解释一下它应该怎么做!输入和预期输出是什么。
【参考方案1】:
您没有使用所需的文件选项正确提及路径。如果您不提供文件选项,那么它也可以工作。 我已经尝试了具有完全限定路径的相同代码,并通过以下更改运行:
ifstream input_file("C:\\Users\\Debug\\names.txt", ios::in);
我得到以下输出:
15
11
8
【讨论】:
成功.. 令人难以置信的放心,我几乎做对了.. 但不知何故我无法做到.. 我认为 ios ::out 是因为你在 mac 上?..跨度> @radhikaiyer 不,std::ios
是 std::basic_ios<char>
的专门化,与 Apple iOS 无关。见cppreference
您使用哪个 IDE 进行调试?
ios::out
用于输出而不是用于输入或 ifstream,您的意思是 ios::in
但在 ifstream 中是默认值。
@Srilakshmikanthan 它应该是 ios::in 选项;虽然它不是强制性的【参考方案2】:
您的代码很难理解,所以我写了以下代码,
#include <iostream>
#include <string>
#include <vector>
const std::vector<std::string> value"aijqy", "bckr", "gls", "dmt",
"en", "uvwx", "oz", "fhp";
void read_names(std::istream &in, std::vector<std::string> &obj)
std::string name;
while (std::getline(in, name))
obj.push_back(name);
void calc_value(const std::vector<std::string> &names, std::vector<int> &values)
for (size_t i = 0; i < names.size(); i++)
int val = 0;
for (size_t j = 0; j < names[i].size(); j++)
for (size_t k = 0; k < 8; k++)
if (value[k].find(names[i][j]) != std::string::npos)
val += (k + 1);
break;
values.push_back(val);
int main()
std::vector<std::string> names;
std::vector<int> values;
read_names(std::cin, names);
calc_value(names, values);
for (size_t i = 0; i < values.size(); i++)
std::cout << values[i] << std::endl;
return 0;
输出:
tom
sally
mary
(ctrl+d) for eof in linux
15
11
8
如果您对使用范围循环感到满意,我使用普通循环,因为您提到您是新手
从文件中读取:
std::fstream file("names.txt");
read_names(file, names);
参考:
1)vector
2)Enter EOF in terminal
【讨论】:
相反,新手应该使用 range-for
而不是索引,因为它删除了一个可能导致索引错误或混淆不同索引变量等的地方。
@Sri laksmi kanthan.. 嘿.. 谢谢.. 我必须在这里遗漏一些东西.. 这是从文件中读取的吗?.. 你能指出它从 names.txt 读取的位置吗? .. 或任何输入文件..
它适用于文件和终端对于终端您应该按ctrl + d
对于 linux 和 ctrl + z
对于 Windows。对于文件,只需将 fstream 或 ifstream 对象替换为 std::cin
,如上所示。
我现在运行你的代码它也给出了相同的但不知道是什么问题,我不想调试你的代码,因为它很难理解。随意使用上面的代码。
@underscore_d 感谢您的建议,使用普通循环的原因是我不知道 OP 是否知道范围循环。那么为什么我使用普通循环。 OP 可以通过谷歌搜索来学习 Range 循环。以上是关于C ++ ifstream嵌套循环[关闭]的主要内容,如果未能解决你的问题,请参考以下文章