读入文件C++

reading in files C++

本文关键字:C++ 读入文件      更新时间:2023-10-16

所以我必须在C++中读取文件,我认为我做的一切都是正确的,但是当我去调试它时,只出现一个黑屏,当我退出底部的黑屏时输出它说找不到或打开 pdb 文件。谁能找到我做错了什么?我打开了两个文件,直到资源文件。这是我的代码:

include iostream,
include string,
include fstream,
using namespace std;
struct dataStruct {
    string playerId,
    lastName,
    firstName,
    division,
    team;
    double plateAppearances,
    atBats,
    singles,
    doubles,
    triples,
    homeRuns,
    sackFlys,
    walks,
    hitByPitch,
    battingAvg,
    onBasePercentage,
    slugginPercentage,
    hits,
    sacrifices,
    sacrificeFlys;
};
int main() {
    string playerId = "",
    lastName = "",
    firstName = "",
    division = "",
    team = "";
    double plateAppearances = 0,
    atBats = 0,
    singles = 0,
    doubles = 0,
    triples = 0,
    homeRuns = 0,
    sackFlys = 0,
    walks = 0,
    hitByPitch = 0,
    battingAvg = 0,
    onBasePercentage = 0,
    slugginPercentage = 0; {
        dataStruct playerStats[500];
        dataStruct newPlayerStats[500];
        int counter = 0;
        int otherCounter = 0;
        ifstream inFile;
        ifstream masterData("Master_Data.csv", ios:: in );
        ifstream newStats("2014_League_Stats.csv");
        if (masterData.is_open()) {
            while (!masterData.eof()) {
                getline(masterData, playerStats[counter].playerId, ',');
                getline(masterData, playerStats[counter].firstName, ',');
                getline(masterData, playerStats[counter].lastName, ',');
                getline(masterData, playerStats[counter].division, ',');
                getline(masterData, playerStats[counter].team, ',');
                masterData >> playerStats[counter].plateAppearances;
                masterData.ignore(',');
                masterData >> playerStats[counter].atBats;
                masterData.ignore(',');
                masterData >> playerStats[counter].singles;
                masterData.ignore(',');
                masterData >> playerStats[counter].doubles;
                masterData.ignore(',');
                masterData >> playerStats[counter].triples;
                masterData.ignore(',');
                masterData >> playerStats[counter].homeRuns;
                masterData.ignore(',');
                masterData >> playerStats[counter].sackFlys;
                masterData.ignore(',');
                masterData >> playerStats[counter].walks;
                masterData.ignore(',');
                masterData >> playerStats[counter].hitByPitch;
                masterData.ignore(',');
                masterData >> playerStats[counter].battingAvg;
                masterData.ignore(',');
                masterData >> playerStats[counter].onBasePercentage;
                masterData.ignore(',');
                masterData >> playerStats[counter].slugginPercentage;
                masterData.ignore(',');
            }
        } else {
            cout << "Error Reading File" << endl;
        }
        if (newStats.is_open()) {
            while (!newStats.eof()) {
                getline(newStats, newPlayerStats[otherCounter].playerId, ',');
                getline(newStats, newPlayerStats[otherCounter].firstName, ',');
                getline(newStats, newPlayerStats[otherCounter].lastName, ',');
                getline(newStats, newPlayerStats[otherCounter].division, ',');
                getline(newStats, newPlayerStats[otherCounter].team, ',');
                newStats >> newPlayerStats[otherCounter].plateAppearances;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].atBats;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].singles;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].doubles;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].triples;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].homeRuns;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].sackFlys;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].walks;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].hitByPitch;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].battingAvg;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].onBasePercentage;
                newStats.ignore(',');
                newStats >> newPlayerStats[otherCounter].slugginPercentage;
                newStats.ignore(',');
            }
        } else {
            cout << "Error Reading File" << endl;
        }
        if (inFile.is_open()) {
            while (!masterData.eof()) {
                playerStats[counter].atBats = (playerStats[counter].plateAppearances +
                    newPlayerStats[otherCounter].plateAppearances) -
                    ((playerStats[counter].walks + newPlayerStats[otherCounter].walks) +
                    (playerStats[counter].hitByPitch + newPlayerStats[otherCounter].hitByPitch) +
                    (playerStats[counter].sacrifices + newPlayerStats[otherCounter].sacrifices));
                playerStats[counter].hits = ((playerStats[counter].singles + newPlayerStats[otherCounter].singles) +
                    (playerStats[counter].doubles + newPlayerStats[counter].doubles) +
                    (playerStats[counter].triples + newPlayerStats[otherCounter].triples) +
                    (playerStats[counter].homeRuns + newPlayerStats[otherCounter].homeRuns));
                playerStats[counter].battingAvg = ((playerStats[counter].hits) / ((playerStats[counter].atBats)));
                playerStats[counter].onBasePercentage = ((playerStats[counter].hits) +
                    (playerStats[counter].hitByPitch) + newPlayerStats[otherCounter].hitByPitch) +
                    (playerStats[counter].walks + newPlayerStats[otherCounter].walks) /
                    ((playerStats[counter].atBats) + (playerStats[counter].walks + newPlayerStats[otherCounter].walks) +
                    (playerStats[counter].hitByPitch) + newPlayerStats[otherCounter].hitByPitch) +
                    (playerStats[counter].sacrificeFlys);
                playerStats[counter].slugginPercentage = (playerStats[counter].hits / playerStats[counter].atBats);
                masterData.close();
                newStats.close();
            }
        }
    }
}
好的,

让我们从基础知识开始,然后从那里继续。由于我没有您的.csv文件的副本,因此当您阅读信息时,我将做出一些假设,但大多数这些更正都与我们如何在 c++ 中读取文件有关。

我知道这些更正中的大多数只是来自编辑您的帖子,但我不认为这是理所当然的:

include iostream, // should be #include <iostream> - no comma.
include string,   // same here #include <string> - no comma.
include fstream,  // ditto.

你的括号也是你的主要关注点,为了编译这段代码,你在它们不属于或不应该属于的地方自由使用括号。只要去掉多余的括号,你就会没事的。

int main() {
string playerId = "",
lastName = "",
firstName = "",
division = "",
team = "";
double plateAppearances = 0,
atBats = 0,
singles = 0,
doubles = 0,
triples = 0,
homeRuns = 0,
sackFlys = 0,
walks = 0,
hitByPitch = 0,
battingAvg = 0,
onBasePercentage = 0,
slugginPercentage = 0; { // Why is this here?
    dataStruct playerStats[500];
    dataStruct newPlayerStats[500];

让我们看看如何从文件中读取:

if (inFile.is_open()) {
        while (!masterData.eof()) {
            playerStats[counter].atBats = (playerStats[counter].plateAppearances +
                newPlayerStats[otherCounter].plateAppearances) -
                ((playerStats[counter].walks + newPlayerStats[otherCounter].walks) +
                (playerStats[counter].hitByPitch + newPlayerStats[otherCounter].hitByPitch) +
                (playerStats[counter].sacrifices + newPlayerStats[otherCounter].sacrifices));
            playerStats[counter].hits = ((playerStats[counter].singles + newPlayerStats[otherCounter].singles) +
                (playerStats[counter].doubles + newPlayerStats[counter].doubles) +
                (playerStats[counter].triples + newPlayerStats[otherCounter].triples) +
                (playerStats[counter].homeRuns + newPlayerStats[otherCounter].homeRuns));
            playerStats[counter].battingAvg = ((playerStats[counter].hits) / ((playerStats[counter].atBats)));
            playerStats[counter].onBasePercentage = ((playerStats[counter].hits) +
                (playerStats[counter].hitByPitch) + newPlayerStats[otherCounter].hitByPitch) +
                (playerStats[counter].walks + newPlayerStats[otherCounter].walks) /
                ((playerStats[counter].atBats) + (playerStats[counter].walks + newPlayerStats[otherCounter].walks) +
                (playerStats[counter].hitByPitch) + newPlayerStats[otherCounter].hitByPitch) +
                (playerStats[counter].sacrificeFlys);
            playerStats[counter].slugginPercentage = (playerStats[counter].hits / playerStats[counter].atBats);
            masterData.close(); // You close the file in your while loop
            newStats.close(); // You close the file in your while loop
        }
    }

收集信息时,您可以在 while 循环中关闭这两个文件。因此,假设masterdata在文件结束之前有您想要从中读取的信息 - 在完成 while 循环中的第一个信息收集序列后关闭它。将代码masterData.close(); AND newStats.close();从 while 循环和 if 语句中取出,并将其放在退出 main 之前。

这让我想到了我的另一个评论 - Main 应该在成功完成程序后返回一些东西。(即 return 0;return EXIT_SUCCESS;)。