如何访问结构中的数据? 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_results
的results
实例中打印默认构造的std::string
winningnums
的值。默认构造的 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';
}
}
快点,我应该如何打印结构中的值? '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_results
的results
实例中打印默认构造的std::string
winningnums
的值。默认构造的 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';
}
}