- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
得到一个格式如下的输入文件:
0 1 Hello world!
1 2 Stack Overflow is a very useful website.
我必须将它解析为以下结构的数组:
struct Message {
int source; //eg. 0
int dest; //eg. 1
std::string content; // eg. "Hello world!\n"
}
但是我缺少好看的代码。
我目前的解决方案是逐行读取文件,然后使用 sscanf 解析它:
我目前的解决方案是读取文件的每一行,然后使用 sscanf 解析它:
std::ifstream f("input");
int src, dest;
char line[1000], text[1000];
while(getline(f, line, 1000)) {
sscanf(line, "%d%d,%999[^\n]", &src, &dest, text);
// Process the values
}
我不喜欢它的是它混合了 iostream 读取和 stdio sscanf。另外,在我的程序中,第二个整数之后的空格和行尾的\n 字符应该是文本的一部分。我使用 appends 来解决这个问题,但我很确定有更有效的解决方案。
你能告诉我如何在没有繁琐代码的情况下用 C++ 做到这一点吗?
谢谢!
最佳答案
我已经成功地创建了一个工作代码,它成功地将数据从文件直接加载到给定的结构中。为此,您必须 1) 通过另一个函数创建文件,或从文件浏览器的级别手动创建文件,2) 数据必须以与结构中相同的方式排序,3) 避免与错误数据相关的任何问题阅读,每行植入一个结构的元素。
我会给你我自己的例子,我在过去的几个小时里一直在努力。
“character.h”头文件
#ifndef CHARACTER_H
#define CHARACTER_H
#include <iostream>
class Character {
public:
struct CharacterParameters {
std::string name;
std::string race;
std::string playerClass;
double height;
double weight;
int age;
};
struct CharacterStatistics {
double maxHealth;
double currentHealth;
double maxStamina;
double currentStamina;
double maxCarryWeight;
double currentCarryWeight;
double currentCharacterWeight;
double basicHealthRegen;
double basicStaminaRegen;
double healthRegenBonus;
double staminaRegenBonus;
double maxSpeed; // modified by items
double currentSpeed;
double currentForce;
double basicAcceleration;
double modifiedAcceleration; // currentCharacterWeight * currentSpeed / currentCharacterWeight
};
Character::CharacterParameters cpInstance;
Character::CharacterStatistics csInstance;
static void CreateNewPlayer();
static void DisplayCurrentSettings();
static void SaveDataToFile();
static void ReadDataFromFile();
private:
};
#endif
“character.cpp”文件
<code ommited>
Character * newPlayer = new Character;
void Character::ReadDataFromFile() {
Character::CharacterParameters cpInstance;
Character::CharacterStatistics csInstance;
ifstream playerData;
playerData.open("playerData.txt");
playerData >> newPlayer->cpInstance.name;
playerData >> newPlayer->cpInstance.race;
playerData >> newPlayer->cpInstance.playerClass;
playerData >> newPlayer->cpInstance.height;
playerData >> newPlayer->cpInstance.weight;
playerData >> newPlayer->cpInstance.age;
playerData >> newPlayer->csInstance.maxHealth;
playerData >> newPlayer->csInstance.currentHealth;
playerData >> newPlayer->csInstance.maxStamina;
playerData >> newPlayer->csInstance.currentStamina;
playerData >> newPlayer->csInstance.maxCarryWeight;
playerData >> newPlayer->csInstance.currentCarryWeight;
playerData >> newPlayer->csInstance.currentCharacterWeight;
playerData >> newPlayer->csInstance.maxSpeed;
playerData >> newPlayer->csInstance.currentSpeed;
playerData >> newPlayer->csInstance.basicAcceleration;
playerData >> newPlayer->csInstance.currentForce;
playerData >> newPlayer->csInstance.modifiedAcceleration;
playerData >> newPlayer->csInstance.basicHealthRegen;
playerData >> newPlayer->csInstance.basicStaminaRegen;
playerData >> newPlayer->csInstance.healthRegenBonus;
playerData >> newPlayer->csInstance.staminaRegenBonus;
playerData.close();
}
“playerData.txt”示例文件存储来自 cpInstance 和 csInstance 结构的数据
Player
Human
Knight
1.77318
58.6618
21
100
100
100
100
90
0
58.6618
12
0
2
117.324
2
5
5
0
0
编辑。我将为您提供“character.cpp”的附加部分,其中包含填充给定结构的函数,以及将它们保存到文件中。
random_device generator;
uniform_real_distribution<double> heightDistribution(1.5, std::nextafter(2, DBL_MAX));
uniform_real_distribution<double> weightDistribution(45, std::nextafter(120, DBL_MAX));
void Character::CreateNewPlayer() {
Character::CharacterParameters cpInstance;
Character::CharacterStatistics csInstance;
char tempRace, tempClass;
string tempString;
int tempInt;
bool isCorrect = false;
newPlayer->cpInstance.height = heightDistribution(generator);
newPlayer->cpInstance.weight = weightDistribution(generator);
newPlayer->csInstance.maxHealth = 100.0;
newPlayer->csInstance.currentHealth = newPlayer->csInstance.maxHealth;
newPlayer->csInstance.maxStamina = 100.0;
newPlayer->csInstance.currentStamina = newPlayer->csInstance.maxStamina;
newPlayer->csInstance.maxCarryWeight = 90.0;
newPlayer->csInstance.currentCarryWeight = 0.0;
newPlayer->csInstance.currentCharacterWeight = newPlayer->cpInstance.weight;
newPlayer->csInstance.maxSpeed = 12.0;
newPlayer->csInstance.currentSpeed = 0.0;
newPlayer->csInstance.basicAcceleration = 2.0;
newPlayer->csInstance.currentForce = newPlayer->csInstance.currentCharacterWeight * newPlayer->csInstance.basicAcceleration;
newPlayer->csInstance.modifiedAcceleration = newPlayer->csInstance.currentForce / newPlayer->csInstance.currentCharacterWeight;
newPlayer->csInstance.basicHealthRegen = 5.0;
newPlayer->csInstance.basicStaminaRegen = 5.0;
newPlayer->csInstance.healthRegenBonus = 0.0;
newPlayer->csInstance.staminaRegenBonus = 0.0;
do {
cout << "Please enter your name: "; cin >> tempString;
} while (tempString.length() > 10);
newPlayer->cpInstance.name = tempString;
do {
cout << "Enter your age: "; cin >> tempInt;
} while (tempInt > 99);
newPlayer->cpInstance.age = tempInt;
cout << "Choose your race (H | V): "; cin >> tempRace;
while (isCorrect != true) {
switch (tempRace) {
case 'H':
case 'h':
newPlayer->cpInstance.race = "Human";
isCorrect = true;
break;
case 'V':
case 'v':
newPlayer->cpInstance.race = "Vampire";
isCorrect = true;
break;
default:
cout << "You have selected a wrong character. Please try again.\n";
cout << "Choose your race (H | V): "; cin >> tempRace;
break;
}
}
isCorrect = false;
cout << "Who you want to be (K | M | A): "; cin >> tempClass;
while (isCorrect != true) {
switch (tempClass) {
case 'K':
case 'k':
newPlayer->cpInstance.playerClass = "Knight";
isCorrect = true;
break;
case 'M':
case 'm':
newPlayer->cpInstance.playerClass = "Mage";
isCorrect = true;
break;
case 'A':
case 'a':
newPlayer->cpInstance.playerClass = "Asassin";
isCorrect = true;
break;
default:
cout << "You have selected a wrong class. Please try again.";
cout << "Who you want to be (K | M | A): "; cin >> tempClass;
break;
}
}
}
void Character::SaveDataToFile() {
ofstream playerData;
playerData.open("playerData.txt");
playerData << newPlayer->cpInstance.name << endl;
playerData << newPlayer->cpInstance.race << endl;
playerData << newPlayer->cpInstance.playerClass << endl;
playerData << newPlayer->cpInstance.height << endl;
playerData << newPlayer->cpInstance.weight << endl;
playerData << newPlayer->cpInstance.age << endl;
playerData << newPlayer->csInstance.maxHealth << endl;
playerData << newPlayer->csInstance.currentHealth << endl;
playerData << newPlayer->csInstance.maxStamina << endl;
playerData << newPlayer->csInstance.currentStamina << endl;
playerData << newPlayer->csInstance.maxCarryWeight << endl;
playerData << newPlayer->csInstance.currentCarryWeight << endl;
playerData << newPlayer->csInstance.currentCharacterWeight << endl;
playerData << newPlayer->csInstance.maxSpeed << endl;
playerData << newPlayer->csInstance.currentSpeed << endl;
playerData << newPlayer->csInstance.basicAcceleration << endl;
playerData << newPlayer->csInstance.currentForce << endl;
playerData << newPlayer->csInstance.modifiedAcceleration << endl;
playerData << newPlayer->csInstance.basicHealthRegen << endl;
playerData << newPlayer->csInstance.basicStaminaRegen << endl;
playerData << newPlayer->csInstance.healthRegenBonus << endl;
playerData << newPlayer->csInstance.staminaRegenBonus << endl;
playerData.close();
}
关于c++ - 从文件中读取混合类型行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29737142/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!