我使用以下代码块来读取以下格式的文本文件:
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对象的地方。
答案 0 :(得分:2)
我不确定问题是什么。但是,代码有几个问题:
eof()
以确定是否有更多内容可供使用。char
数组是不安全的,即它容易出现缓冲区覆盖(主要攻击向量之一)。你想使用一个类似这样的循环:
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