将 space 分隔的文本文件读入数组 C++
Reading space seperated txt file into arrays C++
我遇到的问题是我应该从我的 .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()
}
如有任何帮助,我们将不胜感激,如果您需要更多信息,请告诉我。
使用 .eof 作为条件是一项有风险的业务,正如评论您 post 的人告诉您的那样,eof 运行s 直到最后一次阅读导致失败。这意味着最后一个动作将 运行 两次。
这是一个很好的post:
Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?
还有其他选项,例如 while(file >> data) 或检查文件末尾的位置,然后 运行ing 到那里。
另请注意,如果您在输入文件的每一行之间执行 /n,则需要 "take it" 在继续之前,否则您的下一个阅读操作将采用它而不是采用您想要的文本。
var.address[i]
和 var.value[i]
的类型为 unsigned char
。您的编译器将 chars 视为无符号数字。所以行 inF >> std::hex >> var.address[i]
读取字符。看 ASCII table.
就可以理解了
执行inF >> std::hex >> var.address[i]
时,输入为0x01
,'0'置入,即0x30。
当inF >> std::hex >> 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);
}
我遇到的问题是我应该从我的 .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()
}
如有任何帮助,我们将不胜感激,如果您需要更多信息,请告诉我。
使用 .eof 作为条件是一项有风险的业务,正如评论您 post 的人告诉您的那样,eof 运行s 直到最后一次阅读导致失败。这意味着最后一个动作将 运行 两次。 这是一个很好的post: Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?
还有其他选项,例如 while(file >> data) 或检查文件末尾的位置,然后 运行ing 到那里。
另请注意,如果您在输入文件的每一行之间执行 /n,则需要 "take it" 在继续之前,否则您的下一个阅读操作将采用它而不是采用您想要的文本。
var.address[i]
和 var.value[i]
的类型为 unsigned char
。您的编译器将 chars 视为无符号数字。所以行 inF >> std::hex >> var.address[i]
读取字符。看 ASCII table.
执行inF >> std::hex >> var.address[i]
时,输入为0x01
,'0'置入,即0x30。
当inF >> std::hex >> 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);
}