【问题标题】:Reading space seperated txt file into arrays C++将空格分隔的文本文件读入数组C++
【发布时间】:2020-04-19 16:46:36
【问题描述】:

我遇到的问题是我应该从我的 .txt 文件中读取值 7 write 0x01 0x27 并且循环只会运行 1 次,给出输出 0 - 7 1 0x01 0x27 (1 代表写入,0 = 读取, 2 = 未设置),但是,我用 print 语句打印出来的值显示为

0 - 7 1 0x30 0x78
1 - 1 2 0x00 0x00 //where the 2 is it reads in 0x27 as a string

所以,我试图弄清楚为什么它会读取额外的值,而不仅仅是文件中的值。

void ioLoad(char* name)
{   
    std::ifstream inF;
    inF.open(name, ios_base::in);
    int i = 0;
    string rw;
    while(!inF.eof()){
        inF >> var.time[i]; //int time, from struct 'var'
        inF >> rw;          //string rw, should read either read or write
        inF >> std::hex >> var.address[i] //unsigned char address, from struct 'var' >>PROBLEM LINE<<
        if (rw == "write")
        {
            var.state[i] = WRITE; //stores an enum value as the state
            inF >> std::hex >> var.value[i];  //unsigned char value, from struct 'var' >>PROBLEM LINE<< 
        }
        printf("%d - %d %d 0x%02X 0x%02X\n", i, var.time[i], var.state[i], var.address[i], var.value[i]);
        i++
    }
    inF.close()
}

任何帮助将不胜感激,如果您需要更多信息,请告诉我。

【问题讨论】:

  • inF.eof() 如果最后一次读取操作到达文件末尾,则返回 true,而不是当前读取位置是否在文件末尾。
  • 请在minimal reproducible example发布实际代码。发布的代码与预期的输出格式不对应。

标签: c++ io ifstream


【解决方案1】:

var.address[i]var.value[i] 的类型为 unsigned char。您的编译器将字符视为无符号数字。所以inF &gt;&gt; std::hex &gt;&gt; var.address[i] 行读取字符。看 ASCII 表就可以理解。

inF &gt;&gt; std::hex &gt;&gt; var.address[i]执行时,输入为0x01,'0'被放置到,即0x30。 当inF &gt;&gt; std::hex &gt;&gt; var.value[i];执行时,输入为x01,'x'被放置到,即0x78。

你可以读入unsigned int tmp

unsigned tmp;
inF >> std::hex >> tmp;
var.address[i] = static_cast<unsigned char>(tmp);
if (rw == "write") {
  var.state[i] = WRITE;
  inF >> std::hex >> tmp;
  var.value[i] = static_cast<unsigned char>(tmp);
}

【讨论】:

    【解决方案2】:

    使用 .eof 作为条件是有风险的业务,正如评论您帖子的人告诉您的那样,eof 一直运行到最后一次阅读导致失败。这意味着最后一个动作将运行两次。 这是一个很好的帖子: Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?

    还有其他选项,例如 while(file >> data) 或检查文件的结尾在哪里并一直运行到那里。

    还请注意,如果您在输入文件的每一行之间执行 /n,则需要在继续之前“接受它”,否则您的下一个阅读操作将接受它而不是获取您想要的文本。

    【讨论】:

    • 谢谢,我会考虑 eof() 并可能更改它。但是,这会影响它为什么在 0x30 0x78 而不是 0x01 0x27 中读取。
    猜你喜欢
    • 2019-10-22
    • 2015-12-03
    • 2021-02-26
    • 1970-01-01
    • 2019-10-30
    • 2016-08-19
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多