如何访问结构中的数据? C++

How to access data in a struct? C++

快点,我应该如何打印结构中的值? 'winningnums' 包含来自另一个函数的字符串(为最小示例进行了编辑)

我已经尝试了下面的程序,但是程序根本没有输出任何东西,是我的语法不正确吗?

 struct past_results {
       std::string date;
       std::string winningnums;
    };

int main(){

    past_results results;

    std::cout << results.winningnums;
     
    return 0;
}

编辑:

只是为了提供更多见解,下面是填充我的结构成员的函数。我是不是哪里做错了?

 //function to read csv
void csv_reader(){
    std::string line;
    past_results results;
    past_results res[104];
    

    int linenum = 0;  



    //open csv file for reading
    std::ifstream file("Hi S.O!/path/to/csv", std::ios::in);
    if(file.is_open()) 
    {
       
        while (getline(file, line))
        {
            std::istringstream linestream(line);
            std::string item, item1;
    
            //gets up to first comma
            getline(linestream, item, ',');
            results.date = item;
    
            //convert to a string stream and put into winningnums
            getline(linestream, item1);
            results.winningnums = item1;
    
            //add data to struct
            res[linenum] = results;

            linenum++;
        }
    }
      
    //display data from struct
    for(int i = 0; i < linenum; i++) {
        std::cout << "Date: " << res[i].date << " \\ Winning numbers: " << res[i].winningnums << std::endl;
    }  

}

您的示例未初始化结构成员。没有要打印的数据,那你为什么期望它输出任何东西?

is my syntax incorrect?

不,这很好,如果您添加包含必要的头文件

#include <iostream>
#include <string>

那么你的整个程序就ok了,会在past_resultsresults实例中打印默认构造的std::stringwinningnums的值。默认构造的 std::string 是空的,因此您的程序不会产生任何输出。


您编辑的问题显示了另一个问题。您永远不会调用 csv_reader(),即使您调用了,结果也不会在 main() 中可见,因为 csv_reader() 中的所有变量都是本地变量。给定一个包含以下内容的文件:

today,123
tomorrow,456

并且如果您从 main() 调用 csv_reader(),它将产生输出:

Date: today \ Winning numbers: 123
Date: tomorrow \ Winning numbers: 456

但正如我提到的,这在 main() 中不可用。


这是一个示例,说明如何从文件中读取结果并在 main() 中提供结果。我用一个std::vector把所有的past_results都存进去了。非常实用,因为它是动态增长的,所以你不必声明一个固定大小的数组。

#include <fstream>
#include <iostream>
#include <sstream>  // istringstream
#include <string>   // string
#include <utility>  // move
#include <vector>   // vector

struct past_results {
    std::string date;
    std::string winningnums;
};

// added operator to read one `past_results` from any istream
std::istream& operator>>(std::istream& is, past_results& pr) {
    std::string line;

    if(std::getline(is, line)) {
        std::istringstream linestream(line);

        if(!(std::getline(linestream, pr.date, ',') &&
             std::getline(linestream, pr.winningnums)))
        { // if reading both fields failed, set the failbit on the stream
            is.setstate(std::ios::failbit);
        }
    }
    return is;
}

std::vector<past_results> csv_reader() { // not `void` but returns the result
    std::vector<past_results> result; // to store all past_results read in

    // open csv file for reading
    std::ifstream file("csv"); // std::ios::in is default for an ifstream
    if(file) {
        // loop and read records from the file until that fails:
        past_results tmp;
        while(file >> tmp) {   // this uses the `operator>>` we added above
            // and save them in the `result` vector:
            result.push_back(std::move(tmp));
        }
    }

    return result; // return the vector with all the records in
}

int main() {
    // get the result from the function:
    std::vector<past_results> results = csv_reader();

    // display data from all the structs
    for(past_results& pr : results) {
        std::cout << "Date: " << pr.date
                  << " \\ Winning numbers: " << pr.winningnums << '\n';
    }
}