gpt4 book ai didi

将文本转换为二进制文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:13 24 4
gpt4 key购买 nike

我需要将以下格式的文本文件转换为二进制文件:

第一行包含库存中的产品数量,后面几行包含:
商品名称'\t' 商品价格'\t' 数量'\n'(列之间可以有多个\t)

对于每个产品,二进制输出文件将包含一个代表产品名称长度的整数、包含产品名称的字符、一个代表价格的整数和一个代表数量的整数。

示例输入文件:

Asus Zenbook    1000    10
iPhone 5 750 22
Playstation 4 1000 0

我写了下面的代码,我知道我应该看到纯文本的字符串,而整数将显示为乱码(二进制):

int convertTextToBinary(char *fileName)
{
FILE *pText, *pBinary;

int size, i;

char *currProdName;
int currProdNameLen, currQuantity, currPrice;

if (checkFileExists(fileName) == FALSE)
{
printf("- Given file does not exists!\n");
return ERROR;
}

else
pText = fopen(fileName, "r");

// get the number of products in the inventory
fscanf(pText, "%d", &size);
#ifdef DBG
printf("##DBG Successfuly read &size = %d DBG##\n", size);
#endif
pBinary = fopen(strcat(fileName, ".bin"), "wb");

fwrite(&size, sizeof(int), 1, pBinary);
#ifdef DBG
printf("##DBG Successfuly wrote &size = %d DBG##\n", size);
#endif
for (i = 0; i < size; i++)
{
// get product name and name length
currProdNameLen = getProdName(pText, &currProdName);
#ifdef DBG
printf("##DBG %d Successfuly read &currProdName = %s DBG##\n", i+1, currProdName);
printf("##DBG %d Successfuly read &currProdNameLen = %d DBG##\n", i+1, currProdNameLen);
#endif
// get product price
fscanf(pText, "%d", &currPrice);
printf("##DBG %d Successfuly read &currPrice = %d DBG##\n", i+1, currPrice);
// get product quantity
fscanf(pText, "%d", &currQuantity);
printf("##DBG %d Successfuly read &currQuantity = %d DBG##\n", i+1, currQuantity);
// write data to binary file
fwrite(&currProdNameLen , sizeof(int), 1, pBinary);
fwrite(&currProdName, sizeof(char), currProdNameLen, pBinary);
fwrite(&currPrice, sizeof(int), 1, pBinary);
fwrite(&currQuantity, sizeof(int), 1, pBinary);
free(currProdName);
}

fclose(pText);
fclose(pBinary);
return 1;
}

/* This function checks if a file in a given path exists or not by using fopen with "read" argument */
BOOL checkFileExists(char *fileName)
{
FILE *fp;

fp = fopen(fileName, "r");

// file does not exists
if (fp == NULL)
return FALSE;

// file does exists
else
{
fclose(fp);
return TRUE;
}
}
int getProdName(FILE *fp, char **prodName)
{
int nameLen = 0, offset;

// count the length of the product name
while (fgetc(fp) != '\t')
nameLen++;

// allcoate memory for the product name
*prodName = (char*)malloc(sizeof(char)*nameLen);
//checkalloc(&prodName);

// get the cursor back to the original position
offset = -1 * nameLen;
fseek(fp, offset, SEEK_CUR);

// copy product name from text to string
fgets(*prodName, nameLen, fp);

return strlen(*prodName);
}

但是见鬼,我的输出文件看起来像这样:

       ¨ ּּּּּט        ¨ ּּּ¯        ¨ ּּּּּּּּ   ּּּ«
¨

其中没有纯文本。我已经尝试将 fopen 参数从“wb”更改为“w”,但我仍然得到乱码文件。我做错了什么?

最佳答案

在这里你写指针和额外的垃圾而不是它指向的字符串:

    fwrite(&currProdName, sizeof(char), currProdNameLen, pBinary);

你应该使用:

    fwrite(currProdName, sizeof(char), currProdNameLen, pBinary);

在您的版本中,您将指针传递给指针,但您想传递指针本身。

顺便说一句:在您的函数 getProdName() 中,您应该添加一个额外的字符,因为您正在分配准确的字符串长度,但没有空间容纳 0 字节结束。这也会导致问题。 fgets 也减少了一个字符的读取。查看 fgets 的手册页。除了使用 fgets,您还可以使用 fread,因为您无论如何都知道长度。不需要额外的解析。

更新

改变这个:

    fscanf(pText, "%d", &currQuantity);

    fscanf(pText, "%d\n", &currQuantity);

关于将文本转换为二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com