我正在编写将文本文件转换为二进制文件的代码。它不会返回任何错误并且运行良好,除了在这个特定示例中它不会打印名字。我的输入文件包含 john doe 1 4.0
。预期的输出是 johndoe@▒
,但我的输出是 doe@▒
。我试过使用 fseek 移动偏移量。我尝试以不同方式关闭文件。我尝试重命名我的变量并更改 if 语句。
我不是很确定,但我觉得错误可能来自循环。如果我交换 firstName 和 lastName,同样的事情会发生但相反,这意味着我的代码省略了使用 fwrite 首先读取的任何内容。导致这种情况发生的我的代码有什么问题?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void textToBinary(char *inputFile, char *outputFile){
FILE *ifp, *ofp;
char firstName[256], lastName[256];
int sID;
float gpa;
unsigned char firstNameLen = strlen(firstName);
unsigned char lastNameLen = strlen(lastName);
if(((ifp = fopen(inputFile, "r")) != NULL)&&((ofp = fopen(outputFile, "w")) != NULL)){
while((fscanf(ifp, "%s %s %d %f\n", firstName, lastName, &sID, &gpa)) != EOF){
fwrite(&firstNameLen, sizeof(firstNameLen), 1, ofp);
fwrite(firstName, sizeof(char), firstNameLen, ofp);
fwrite(&lastNameLen, sizeof(lastNameLen), 1, ofp);
fwrite(lastName, sizeof(char), lastNameLen, ofp);
fwrite(&sID, sizeof(int), 1, ofp);
fwrite(&gpa, sizeof(float), 1, ofp);
}
fclose(ifp);
fclose(ofp);
}else{
fprintf(stderr, "Couldn't open: %s\n", ifp);
}
}
最佳答案
建议使用上述注释重写代码
//unsigned char firstNameLen = strlen(firstName);
//unsigned char lastNameLen = strlen(lastName);
if(((ifp = fopen(inputFile, "r")) != NULL)&&((ofp = fopen(outputFile, "w")) != NULL)){
while((fscanf(ifp, "%255s %255s %d %f", firstName, lastName, &sID, &gpa)) == 4){
unsigned char firstNameLen = strlen(firstName);
unsigned char lastNameLen = strlen(lastName);
fwrite(&firstNameLen, sizeof firstNameLen, 1, ofp);
fwrite(firstName, sizeof *firstName, firstNameLen, ofp);
fwrite(&lastNameLen, sizeof lastNameLen, 1, ofp);
fwrite(lastName, sizeof *lastName, lastNameLen, ofp);
fwrite(&sID, sizeof sID, 1, ofp);
fwrite(&gpa, sizeof gpa, 1, ofp);
}
fclose(ifp);
fclose(ofp);
}else{
关于c - fscanf() 仅写入输入文件中的部分内容而不是全部内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42150421/