- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个从文件中读取行的函数。但在读取之前,它会返回要读取下一行的地址。
我的职能是:
void print()
{
int j=0;
string a,b,c,d,e;
ifstream i("data.txt");
cout<<setw(15)<<left<<"Hash Value"<<setw(15)<<left<<"Employee Name"<<setw(15)<<left<<"Employee ID"<<setw(15)<<left<<"Salary"<<setw(15)<<left<<"Link"<<endl;
while(j<10)
{
j++;
cout<<i.tellg()<<endl;
i>>a>>b>>c>>d>>e;
cout<<setw(15)<<left<<a<<setw(15)<<left<<b<<setw(15)<<left<<c<<setw(15)<<left<<d<<setw(15)<<left<<e<<endl;
}
i.close();
}
它正在读取的文件是 data.txt:
0 --- 0 0 -1
1 --- 0 0 -1
2 --- 0 0 -1
3 --- 0 0 -1
4 --- 0 0 -1
5 --- 0 0 -1
6 --- 0 0 -1
7 --- 0 0 -1
8 --- 0 0 -1
9 --- 0 0 -1
我得到的输出是:
Hash Value Employee Name Employee ID Salary Link
0
0 --- 0 0 -1
81
1 --- 0 0 -1
157
2 --- 0 0 -1
233
3 --- 0 0 -1
309
4 --- 0 0 -1
385
5 --- 0 0 -1
461
6 --- 0 0 -1
541
7 --- 0 0 -1
617
8 --- 0 0 -1
693
9 --- 0 0 -1
每行长度为 76 个字符。所以每次打印的地址都应该增加 76。但是我不明白打印第 2 行 [哈希值 1] 和第 7 行 [哈希值 6] 时发生了什么。
有人可以帮我解决这个问题吗?
最佳答案
一些事情:
首先,您不是逐行阅读,所以没有理由假设你增加了字符数每次通过循环在一行中。如果你想读行按行,使用 std::getline
,然后从中提取字段该行,使用 std::istringstream
或其他一些方法。
tellg
的结果不是整数,当转换为整数类型(不一定可能),没有保证与您拥有的字节数的关系提取。在 Unix 机器上,结果将对应,并且在 Windows 下 if(且仅当)文件已在二进制模式。在其他系统上,可能没有可见的什么关系都没有。唯一有效的可移植使用tellg
的结果是稍后将其传递给 seekg
;任何事物其他取决于实现。
你怎么知道每一行恰好包含 76 个字符?根据文件的生成方式,可能有一个 BOM开头(如果文件在以 UTF8 编码并且您位于“C”语言环境中)。那又怎样尾随空格。同样,如果您的输入是面向行的,您应该是读取行,然后解析它们。
最后,但也许是最重要的一点:您正在使用>>>
的结果,而不验证运算符是否有效。在你的情况,输出表明它确实如此,但你永远不可能确定而不验证。
在全局范围内,您的循环应如下所示:
std::string line;
while ( std::getline( i, line ) ) {
std::istringstream l( line );
std::string a;
std::string b;
std::string c;
std::string d;
std::string e;
l >> a >> b >> c >> d >> e >> std::ws;
if ( !l || l.get() != EOF ) {
// Format error in line...
} else {
// ...
}
}
输出 tellg
仍然不会告诉你任何信息,但至少你会正确阅读输入。 (输出的长度line
在某些情况下可能很有用。)
关于c++ - Tellg 返回意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399146/
ifstream::tellg() 为某个文件返回 -13。 基本上,我编写了一个分析一些源代码的实用程序;我按字母顺序打开所有文件,我从“Apple.cpp”开始,它工作得很好..但是当它到达“Co
为什么tellg()在写操作后移动,我想应该是tellp()? std::fstream fs("c:\\log.txt", std::ios::in | std::ios::out | std::i
我有一个从文件中读取行的函数。但在读取之前,它会返回要读取下一行的地址。 我的职能是: void print() { int j=0; string a,b,c
我正在用 c++98 编写一个小解析器(是的,不能使用 11)。我正在使用 std::stringstream,我通过引用传递给不同的函数,让我们称它们为子解析器。为了知道要调用哪个子解析器,我需要知
我以二进制模式打开了一个文件,进行以下操作得到了 x 的负值。我打开的文件大小约为 2.5 GB。 infile.seekg(0, ios::end); __int64 x = infile.tell
我有一个正在读取的大型二进制文件,我想将当前位置与一个 unsigned long long int 进行比较。但是,根据 C++ 文档,我不清楚是否: tellg() 的返回类型是什么 如何比较 t
我做了一个示例项目来将文件读入缓冲区。当我使用 tellg() 函数时,它给我的值比read 函数实际上是从文件中读取的。我认为有一个错误。 这是我的代码: 编辑: void read_file (c
所以,我很好奇,因为我一直在使用这种相当有用的方法来获取文件的大小,但有些事情困扰着我。将流锁定到文件系统上的文件和 fileStream.seekg(0, std::ios::beg); int b
我下载了一个 C++ 实用程序,但在读取输入文件时由于错误而死掉了。不幸的是,它输出的只是“偏移量错误:文件中的 69570744324”;通过查看它的源代码,我发现它实际上是在那里打印出 .tell
我遇到了一个奇怪的问题。假设我正在读取这样的文件: std::ifstream in("file.txt", std::ios::binary); std::string text; in.seekg
我一直在 Visual Studio 2015 中使用 iostream 进行一些基本的文件操作,并注意到这种奇怪的行为。 #include #include #include void mai
假设我想获得两个 tellp() 输出之间的差异(整数)。 如果写入一个大文件,tellp() 的输出可能会很大,所以将它存储在一个 long long 中是不安全的。有没有安全的方法来执行这样的操作
我知道这个标题听起来很疯狂,但我现在正在亲 body 验这一点,我想不出任何失败的原因。 我正在使用 getline() 读取文件 在阅读结束时,我调用了 tellg()。但是,此调用总是失败(返回值
读取.cpp #include #include using namespace std; int main(void) { int id; char name[50];
我正在尝试使用 fstream 从文件中读取。我正在尝试的文件阅读有这样的内容: 1200 1000 980 890 760 我的代码: #include #include using names
我正在读取 data.txt: ////////////////////////////////////////////////// data.txt: ///////////////////////
我有一个 std::fstream,我使用它导入 std::fstream myFile { "C:/path/to/file.txt" }; 当我想读取第一个字节时,我使用 char c; cout
与 fstream file("test.txt",ios_base::in | ios_base::out | ios_base::binary); tellp 和 tellg 对于 file 是否
我在 std::fstream 类的 tellg() 函数中遇到问题。通常它应该返回当前字符在输入流中的位置。但是,它对我来说很奇怪。下面是一些简短的示例代码: #include #include
我正在编写一个 C++ 控制台应用程序。在用 size(int) rowSize 和 columnSize 创建了一个 Matrix 之后,我想将文本文件中的字母写入矩阵,但是 while 循环永远不
我是一名优秀的程序员,十分优秀!