我正在尝试从名为'weapon.txt'的文件中读取这些行,然后将它们输入到一个很长的行结构中
struct weapon
{
char name[20]; //Edited
int strength;
}
要读取的文件如下所示:
Excalibur
150
Throwing Stars
15
Rapier
200
Bow and Arrow
100
Axe
200
Crossbow
100
Scimitar
250
Rusted Sword
10
Soul Slayer
500
我现在的代码是
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std;
struct WeaponInfo
{
char name[16];
int strength;
};
const int MaxWeap = 10;
void openfile(ifstream&); //Opening the file
void displayfile(ifstream&, WeaponInfo&);//Display file
int main ()
{
WeaponInfo weapon[MaxWeap];
ifstream fin;
openfile(fin);
displayfile(fin, weapon[MaxWeap]);
}
void openfile(ifstream& fin)
{
fin.open("weapon.txt");
}
void displayfile(ifstream& fin, WeaponInfo& weapon[MaxWeap])
{
char nm;
int str;
while (fin.eof() == 0)
{
for(int i = 0; i <= MaxWeap; i++);
{
fin.getline(nm);
fin.getline(str);
strcpy(weapon[i].name, nm);
strcpy(weapon[i].strength, str);
i++;
cout << weapon[i].name << "\n" << weapon[i].strength << endl;
}
}
fin.close();
}
编辑:这是我现在重新做的事情,我得到的编译错误:'武器'的声明作为参考数组;在函数'void displayfile(...)'fin'中未在此范围内声明; “武器”未在此范围内声明; ma,e'查找'i'为ISO'更改为'范围[-fpermissive]。
答案 0 :(得分:1)
我首先倾向于使用std::string
而不是char数组 - 它们更容易使用。所以结构现在看起来像这样:
struct weapon
{
string name;
int strength;
};
接下来,您需要一些能够从输入流中读取结构的内容:
bool getWeapon( ifstream& is, weapon& w )
{
getline(is, w.name) ;
string strengthStr;
getline(is, strengthStr) ;
w.strength = strtol( strengthStr.c_str(), NULL, 0 );
return !is.eof();
}
这里有两件事,我使用strtol
作为从字符串到int的转换函数。使用了atoi
,但strtol
为您提供了更多的灵活性,最重要的是,更好的错误检查,尽管我并不打算在这里实施它。 stringstream
可能是另一种选择。
其次,我返回一个布尔值,指示名称是否为空。这样做的原因是,在代码的后面,我在ifstream上检查eof()
时,在读取文件末尾之前,它实际上并未设置。所以最后一次好的阅读不会设置它,但第一次尝试重新过去它会。然后在这里返回false将向呼叫者表明&#39; get&#39;由于ifstream在文件末尾而失败。
最后,我们需要阅读以下内容中的所有内容:
ifstream input;
input.open("weapons.txt");
vector<weapon> ws;
if ( input )
{
while (! (input.eof()))
{
weapon w;
if ( ! getWeapon( input, w ) )
break;
ws.push_back( w );
}
}
input.close();
这将把所有武器都放入一个矢量中。请注意,如果getWeapon
无法预防添加“空白”,则会致电{{1}}。武器。不是最迷人的解决方案,但它应该有效。
答案 1 :(得分:0)
伪代码就是这样的,(就像Martol1ni为你编写的那样):
open the file
while (!end-of file)
{
create instance of struct weapon
read a line and strcpy into weapon.name
read a line and set weapon.strength = atoi(line)
do something with the instance, eg. add to list, call a member function, etc.
}
loop
close file.
答案 2 :(得分:-1)
假设你控制了weapon.txt,不用费心去检查文件中的错误,你可以这样做。下次,做一点研究...... :)
#include <fstream>
#include <vector>
#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
struct weapon
{
string name;
int strength;
weapon(string n, int s) : name(n), strength(s) {}
};
void readFileToVec(vector<weapon> &myVec) {
ifstream in("weapon.txt");
while (!in.eof()) {
string name;
getline(in,name);
string strength;
getline(in,strength);
weapon myWep(name,atoi(strength.c_str()));
myVec.push_back(myWep);
}
in.close();
}