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..

【问题讨论】:

你为什么使用chaldeans的数组?只需改用std::vector 请将代码编辑为可读。 想想你的for循环,它到底在做什么?它应该做什么?它真的需要为每一行输入运行吗? 我很抱歉..我是 C++ 新手..你说我正在尝试做的事情不适用于数组..或者只是向量更容易循环? 请解释一下它应该怎么做!输入和预期输出是什么。 【参考方案1】:

您没有使用所需的文件选项正确提及路径。如果您不提供文件选项,那么它也可以工作。 我已经尝试了具有完全限定路径的相同代码,并通过以下更改运行:

 ifstream input_file("C:\\Users\\Debug\\names.txt", ios::in);

我得到以下输出:

15
11
8

【讨论】:

成功.. 令人难以置信的放心,我几乎做对了.. 但不知何故我无法做到.. 我认为 ios ::out 是因为你在 mac 上?..跨度> @radhikaiyer 不,std::iosstd::basic_ios&lt;char&gt; 的专门化,与 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嵌套循环[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何理解和完成下面提供的嵌套循环挑战[关闭]

什么是更快的嵌套循环或多个循环? [关闭]

列表理解循环排序取决于嵌套[关闭]

嵌套循环性能[关闭]

理解 javascript 嵌套 for 循环的问题 [关闭]

请教下VB嵌套循环?