2016-11-25 94 views
-2

这里打印的值是library.h 的片段顺便说一句library.h的这个片断这是为什么不从txt文件

#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 
#include <vector> 
#include <string> 
#include <iostream> 
#include <fstream> 
#pragma warning (disable:4267) 
#pragma warning (disable:4311) 
#pragma warning (disable:4313) 
#pragma warning (disable:4244) 
#pragma warning (disable:4996) 
#pragma warning (disable:4800) 
#pragma warning (disable:4018) 
#pragma comment(lib, "library.lib") 
using namespace std; 

Library.h是一个标题文件,它是一个图形库也包含已包含的大多数C++库,我需要打印来自database1.txt的所有值,btw对不起,如果我的代码看起来像是一场灾难,并未将C++编码四年。

#include <library.h> 
#include <iterator> 
#include <vector> 
#include <sstream> 

struct st { 
double month; 
double day; 
double year; 
double social; 
string fname; 
string lname; 
double address; 
}roll [14]; 
void rawr (st dat); 

void main() 
{ 
ifstream meow("database1.txt"); 

{ 
if (meow.fail()) 
cout << "Not enough data in the file!, NOOB"; 
} 
int n; 
while (meow){ 
double d; 
string e, f; 
double g; 
double a, x, c; 
meow>>a; 
meow>>x; 
meow>>c; 
meow>> d; 
meow>> e; 
meow>> f; 
meow>>g; 
cout << a<<" "<<x<<" "<< c<< " "<<d<<" "<<e<<" "<<f<<" "<<g; 
for (n=0; n<14; n++) 
{ 
stringstream(a)>> roll[n].month; 
stringstream(x)>> roll[n].day; 
stringstream(c)>> roll[n].year; 
stringstream(d)>> roll[n].social; 
stringstream(e)>> roll[n].fname; 
stringstream(f)>> roll[n].lname; 
stringstream(g)>> roll[n].address; 
} 
for (n=0; n<14; n++) 
rawr (roll[n]); 
} 
} 
void rawr (st dat) 
{ 
    cout << dat.month<<" "<<dat.day<<" "<< dat.year<< " "<<dat.social<<" "<<dat.fname<<" "<<dat.lname<<" "<<dat.address; 
}  
+1

解决此类问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

+0

由于'main'的定义不正确,您可能*问题。 'main'函数返回一个'int'。总是。 –

+0

如果这是纯粹的运气编译它,因为'std :: ifstream'需要''这不在你的包含列表中。 'std :: string'也不会被''完成,或者任何通过'' – WhozCraig

回答

1

我认为你应该在担心库标题之前让你的简单程序工作。你的程序有太多问题。让我们更喜欢一个更简单的方法:

struct Record 
{ 
    unsigned int month; // Month's can't be negative nor floating point. 
    unsigned int day; 
    unsigned int year; 
    std::string social; // Social has form xxx-xx-xxxx, so it can't be floating point. 
    std::string first_name; 
    std::string last_name; 
    std::string address; 
}; 

为了使从流更容易输入,让我们过载operator >>

struct Record 
{ 
    // Same as above 
    friend std::istream& operator>>(std::istream& input, Record& r); 
}; 

std::istream& operator>>(std::istream& input, Record& r) 
{ 
    input >> r.month; 
    input >> r.day; 
    input >> r.year; 
    input >> r.social; 
    input >> r.first_name; 
    input >> r.last_name; 
    input >> r.address; 
    return input; 
} 

重载operator>>将使输入轻松了不少:

int main(void) 
{ 
    std::ifstream database_stream("database1.txt"); 
    if (!database_stream) 
    { 
    std::cerr << "Error opening database1.txt\n"; 
    return EXIT_FAILURE; 
    } 
    // This code will be execute if the file was opened successfully. 
    std::vector<Record> database; 
    Record r; 
    while (database_stream >> r) 
    { 
    database.push_back(r); 
    } 
    return EXIT_SUCCESS; 
} 

不需要stringstreamRecord的输入功能已被封装成对象,因此简化了main函数。

operator<<也可以以相似的方式在Record结构中重载。这也将简化main函数。

编辑1:重构
monthdayyear可以*重构into a separate Date`类(其可以在其他任务重复使用):

struct Date 
{ 
    unsigned int month; 
    unsigned int day; 
    unsigned int year; 
    friend std::istream& operator>>(std::istream& input, Date& d); 
    friend std::ostream& operator>>(std::ostream& output, const Date& d); 
}; 

std::istream& 
operator>>(std::istream& input, Date& d) 
{ 
    input >> d.month >> d.day >> d.year; 
    return input; 
} 

std::ostream& 
operator<<(std::ostream& output, const Date& d) 
{ 
    output << d.month << "\t" << d.day << "\t" << d.year; 
    return output; 
} 

Record然后简化为:

struct Record 
{ 
    Date d; 
    std::string social; // Social has form xxx-xx-xxxx, so it can't be floating point. 
    std::string first_name; 
    std::string last_name; 
    std::string address; 
    friend std::istream& operator>>(std::istream& input, Record& r); 

};

而且你Record::operator>>方法简化为:

std::istream& 
operator>>(std::istream& input, Record& r) 
{ 
    input >> r.d >> r.social >> r.first_name >> r.last_name >> r.address; 
    return input; 
} 

如果你把你的Date结构成单独的文件,你可以通过包含头文件到其他源文件重用,然后Date.cpp文件添加到项目。无需浪费时间重写或测试它。 :-)

+0

原谅我,但它正在阅读的文本文件具有社会性没有破折号,但感谢您为我简化 – Orenrocco

+0

如何合并值可以从另一个具有相同的人,但具有附加值的txt文件persough – Orenrocco

+0

让我们考虑这一点。如果某人有附加值,则需要将这些属性添加到结构中。在追加数据库之前,您还需要*搜索数据库。嗯,谈到数据库,你有没有使用它的原因? –

相关问题