我在C ++中编写了一个代码,它打开一个.txt文件并读取其内容,将其视为(MAC地址数据库),每个mac地址由(。)分隔,我的问题是在我搜索之后文件总行数,iam无法返回指向文件初始位置的指针,我使用seekg() and tellg()
来操作指向文件的指针。
这是代码:
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
int main ()
{
int i = 0;
string str1;
ifstream file;
file.open ("C:\\Users\\...\\Desktop\\MAC.txt");
//this section calculates the no. of lines
while (!file.eof() )
{
getline (file,str1);
for (int z =0 ; z<=15; z++)
if (str1[z] == '.')
i++;
}
file.seekg(0,ios::beg);
getline(file,str2);
cout << "the number of lines are " << i << endl;
cout << str2 << endl;
file.close();
getchar();
return 0;
}
以下是MAC.txt文件的内容:
0090-d0f5-723a。
0090-d0f2-87hf。
b048-7aae-t5t5。
000E-f4e1-XXX2。
1c1d-678c-9db3。
0090-d0db-f923。
d85d-4cd3-A238。
1c1d-678c-235d中。
here the the output of the code is supposed to be the first MAC address but it returns the last one .
答案 0 :(得分:3)
file.seekg(0,ios::end);
我相信你想要file.seekg(0,ios::beg);
。
距离末尾的零偏移量(ios::end
)是文件的结尾。读取失败,您将获得在缓冲区中读取的最后一个值。
此外,一旦你到达eof
,你应该在寻找之前用file.clear();
手动重置它:
file.clear();
file.seekg(0,ios::beg);
getline(file,str2);
如果在执行文件操作时检查错误,则更容易捕获错误。有关示例,请参阅Kerrek SB的答案。
答案 1 :(得分:2)
你的代码犯了各种各样的错误。你永远不会检查任何错误状态!
应该如何:
std::ifstream file("C:\\Users\\...\\Desktop\\MAC.txt");
for (std::string line; std::getline(file, line); )
// the loop exits when "file" is in an error state
{
/* whatever condition */ i++;
}
file.clear(); // reset error state
file.seekg(0, std::ios::beg); // rewind
std::string firstline;
if (!(std::getline(file, firstline)) { /* error */ }
std::cout << "The first line is: " << firstline << "\n";