c - fscanf() 仅写入输入文件中的部分内容而不是全部内容

标签 c file while-loop fwrite scanf

我正在编写将文本文件转换为二进制文件的代码。它不会返回任何错误并且运行良好,除了在这个特定示例中它不会打印名字。我的输入文件包含 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/

相关文章:

c# - 哪个最适合用于从 byte[] 创建文件?

javascript - 循环浏览页面直到找到特定电影

java - do-while(false) 的优点是什么?

c++ - 运行时错误 : RunTime Error : map/set iterators incompatible

c - 如何在结构中声明 uint8_t "string"?

c - C 中的 Scanf double 没有给出正确的值

Python重载文件

perl - 如何获取使用 Perl 打开的文件的当前行号?

c - 在 Xcode 上编译时出现 (lldb)

C scanf 不适用于多字输入