我正在尝试读取文件的某个部分,并且每行的数据量不同但我知道我想要多少字节的信息。像这样:
5bytes.byte1byte2byte3byte4byte5CKSum //where # of bytes varies for each line (and there is no period only there for readability)
实际数据:
05AABBCCDDEE11
03AABBCC22
04AABBCCDD33
所以我希望我的宽度是这样的变量:
fscanf_s(in_file,"%variableX", &iData);
这可能吗,因为现在我想我必须创建一个案例陈述?
答案 0 :(得分:11)
不幸的是,不,没有像printf那样的'*'修饰符会导致scanf从变量中获取其字段宽度或精度。您最接近的是动态创建格式字符串:
char format[8];
sprintf(format, "%%%dX", width);
fscanf(in_file, format, &iData);
答案 1 :(得分:1)
如果您真的希望能够以编程方式调整fscanf格式,可以尝试使用足够的空间堆栈分配字符串,然后生成如下格式: e.g。
char formatString[100];
// writes "%max_size[0-9]", substituting max_size with the proper digits
sprintf(formatString, "%%%d[0-9]", MAX_SIZE);
fscanf(fp, formatString, buffer); // etc...
答案 2 :(得分:0)
带有%X的fscanf将自动停在换行符,对吗?如果这些字段确实是换行符(如你的例子中所示),那么你不能只调用
fscanf(in_file, "%X", &iData);
让fscanf找出结局的位置?
答案 3 :(得分:0)
您也可以考虑使用C ++流。
#include <ifstream>
#include <iostream>
// open the file and create a file input stream
ifstream file("test.txt" , ios::in | ios::binary);
// loop through the whole file
while (ifs.good())
{
// extract one byte as the field width
unsigned char width;
file.read(&width, 1);
// extract width number of unformatted bytes
char * bytes = new char[width];
file.read(bytes, width);
// process the bytes
...
delete [] bytes;
// skip EOL characters if needed
// file.seekg(1, ios_base::cur)
}
file.close();
如果你似乎指出包含换行符,那么更简单的方法就是使用getLine()。查看http://www.cplusplus.com/reference/iostream/ifstream/了解更多使用read(),get(),getLine()和许多其他强大流函数的方法。
答案 4 :(得分:0)
我认为最简单的方法是使用 fread():
fread(buffer, nbytes, sizeof(char), in_file);