【问题标题】:Beginning Address Endless Loop起始地址无限循环
【发布时间】:2012-04-17 04:06:37
【问题描述】:

我试图在读取文件时获取文件每一行的起始地址,并将其打印到屏幕上,但由于某种原因,它只会导致无限循环。我正在阅读的文件只是一个普通的文本文件。这就是我现在要做的事情。

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char* argv){
    ifstream file;
    string name, lnstr;
    int addy;

    if (argc > 1)
        name = argv[1];
    else
    {
        cout << "Please Enter Your Filename: ";
        getline(cin, name);
    }
    file.open(name.data());
    if(!file)
    {
        perror(name.data());
        exit(1);
    }
    addy = 0;
    while(getline(file, lnstr))
    {
        cout << file.seekg(addy, ios::beg) << endl;
        addy++;
    }
}

即使我将0作为seekg的第一个参数,它仍然会导致无限循环,或者它只是显示相同的数字一堆。不知道我错过了什么。

【问题讨论】:

  • 想想 ios::beg 在你的 while 循环中做了什么

标签: c++ file iostream memory-address


【解决方案1】:

当您调用 ios::beg 时,您将 get 指针的位置设置为文件的开头。你实际上并不需要这个调用,这段代码应该适合你:

file.open(name.c_str()); // open file
if(file) {
  while(getline(file, lnstr)) {
    cout<< lnstr <<endl;
  }
}  

More on seekg.

【讨论】:

  • lnstr 只是我文件中的文本。我是否必须将其转换为 c_str() 才能正常工作?
  • 在您的情况下,如果您将 Instr 声明为字符串,则不需要使用 c_str()。
【解决方案2】:

我想你想要tellg,而不是seekg

【讨论】:

  • 我不明白。将什么显示为 8 字节值?
  • 地址为 8 字节值
  • @Derp 地址是什么?除非您对文件进行内存映射,否则文件没有内存地址。
  • tellg 应该在 64 位系统上返回一个 64 位值。在具有 64 位文件的 32 位系统上,我不确定。您可能需要使用FILEs 而不是iostreams,以便使用ftelli64
  • 或者你可以在每次循环中只做addy += name.size() + 1,根本不使用seek/tell。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2013-05-30
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多