使用fstream对象将文件中的信息存储到变量中

时间:2012-10-16 20:36:04

标签: c++ fstream

我使用以下代码块来读取以下格式的文本文件:

firstname lastname id mark
firstname lastname id mark

以下是代码块。

void DBManager::ReadFile(void){
fstream myfile; /*fstream object that will be used for file input and output operations*/
char* fn;       /*pointer to the storage which will hold firstname*/
char* ln;       /*pointer to the storage which will hold lastname*/
int id;         /*integer var to hold the id*/
float mark;     /*float var to hold the mark*/

/*read in the filename*/
g_FileName = new char[1024];                /*allocate memory on the heap to store filename*/
cout << "Please enter the filename:";
    cin >> g_FileName;

/*open file*/
myfile.open(g_FileName, ios::in | ios::out);

if(myfile.is_open()){   /*check if the file opening is successful*/
    cout << "File reading successful !\n";

    /*read information from the file into temporary variables before passing them onto the heap*/
    while (!myfile.eof()) {

        fn=(char*) new char[1024];
        ln=(char*) new char[1024];
        myfile >> fn >> ln >> id >> mark;
        cout << fn << " " << ln << " " << id << " " << mark << " " << endl;

    }
    myfile.close();
}
else{                   /*else print error and return*/
    perror("");
    return;
}

}

上面的代码块有效! :) 但令我感到惊讶的是myfile如何知道它应该一次保留一行以及它如何足够聪明地设置四个变量。

我是C ++的新手,因此可能会在某些文档中介绍。但是我很乐意从你那里获得一些见解,或者链接到我能更好地理解fstream对象的地方。

2 个答案:

答案 0 :(得分:2)

我不确定问题是什么。但是,代码有几个问题:

  1. 您应该始终检查输入 尝试阅读。
  2. 测试eof()以确定是否有更多内容可供使用。
  3. 你有内存泄漏,在每个迭代器中分配内存。
  4. 在没有约束的情况下读入char数组是不安全的,即它容易出现缓冲区覆盖(主要攻击向量之一)。
  5. 你想使用一个类似这样的循环:

    std::string fn, ln;
    while (myfile >> fn >> ln >> id >> mark) {
         ...
    }
    

答案 1 :(得分:1)

在C ++中,std::fstream是一种专门用于文件的流。从文件中读取时,std::fstream的界面几乎与std::cin相同。输入流被编程为在使用>>运算符询问时读取下一个单词或数字。他们知道单词和数字的位置,因为它们被空白区分开。在默认语言环境中,空格,制表符和换行符被视为空格。您可以更改区域设置以包含其他字符(如逗号),并在从文件读取时跳过这些字符。基本上,当使用输入流进行读取时,换行符和空格的处理方式相同。

有关学习流的一些很好的解释是:http://www.cprogramming.com/tutorial/c++-iostreams.html