所以我需要将文本文件转换为二进制文件。
格式为 -
的文本文件firstname lastname id gpa (string string unsigned int float)
文本文件的示例可以是:
jon smith 32 2.5
乔年轻12 3.4
void textToBinary(char *inp, char *out)
{
FILE *finp;
FILE *fout;
unsigned int x;
float y;
char first[SIZE], last[SIZE];
finp = fopen(inp, "r");
fout = fopen(out, "w");
rewind(finp);
while(1)
{
fscanf(finp, "%s %s %u %f\n", first, last, &x, &y);
fwrite(first, 1, sizeof(char), fout);
fwrite(last, 1, sizeof(char), fout);
fwrite(&x, 4, sizeof(unsigned int), fout);
fwrite(&y, 4, sizeof(int), fout);
if(feof(finp))
{
break;
}
}
fclose(finp);
fclose(fout);
}
在itsunix中使用diff命令我将输出的二进制文件与二进制文件的外观进行比较。
>diff output.bin b1.bin
>Binary Files output.bin b1.bin differ
所以这必须意味着我的文本文件没有正确转换为正确的二进制文件。
答案 0 :(得分:0)
提供的源代码显示了使用public class CustomView extends ViewGroup{
public CustomView (Context context) {
super(context);
init(context);
}
public CustomView (Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CustomView (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
@TargetApi(21)
public CustomView (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context);
}
private void init(Context context) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = mInflater.inflate(R.layout.review_list_item, this, true);
//rest of view initialization
}
}
函数在二进制文件中记录数据的误解。
错误1 - 记录字符串,使用固定大小或实际长度。
基于fwrite()
和fwrite(first, 1, sizeof(char), fout);
两行。
使用:
fwrite(last, 1, sizeof(char), fout);
或者:
fwrite(first, (strlen(first)+1), sizeof(char), fout);
错误2 - 只记录一个fwrite(first, SIZE, sizeof(char), fout);
,使用1个元素。
基于第unsigned int
行。
使用:
fwrite(&x, 4, sizeof(unsigned int), fout);
错误3 - 要记录一个fwrite(&x, 1, sizeof(unsigned int), fout);
,请使用正确的float
。
基于第sizeof()
行。
使用:
fwrite(&y, 4, sizeof(int), fout);
<强>附加强>
在所有情况下,使用
fwrite(&y, 1, sizeof(float), fout);
时请勿忘记检查退回的内容 value(必须等于写入的元素数)。