c - 如何将二进制文件中的特定行读入结构C

标签 c structure binaryfiles fread fseek

本质上,我使用 fseek() 和 fwrite() 打印到二进制文件。但是,我想将特定行的内容读入结构中。我还使用 fseek() 和 fread() 来获取内容。我提示用户输入代码。根据我所了解到的,我将使用从用户获得的值在 fseek 函数中使用来获取要开始读取的特定行。显然,读取内容的 fseek 不起作用,当它显示在屏幕上时,我基本上得到了乱码。非常感谢您的帮助。

#include <conio.h>
#include <stdio.h> 


typedef struct registered
{
    int compcode;
    char compname[20];
    int pinID;
    int custID;
    char IDtype[15];
    int compID;
}REGISTERED;

void AddUpdate(REGISTERED info);
void SellPetrol();

void main(){
    REGISTERED info = {0, "Apple", 0, 0, "passport", 0};
    REGISTERED list;
    AddUpdate(info);
    SellPetrol();

}

void AddUpdate(REGISTERED info){
    int choice;


    FILE *registryfile = NULL;
    registryfile = fopen("Sales.dat", "ab");


    if (registryfile == NULL){
        perror("Error: ");
    }
    else{
        do{


            printf("Company Code: ");
            scanf("%d", &info.compcode);
            printf("Company Name: ");
            scanf("%s", &info.compname);
            printf("Pin: ");
            scanf("%d", &info.pinID);
            printf("Customer ID: ");
            scanf("%d", &info.custID);
            printf("ID type: ");
            scanf("%s", &info.IDtype);
            printf("Company ID: ");
            scanf("%d", &info.compID);  

            fseek(registryfile, (info.compcode - 1) * sizeof(REGISTERED), SEEK_SET);
            fwrite(&info, sizeof(REGISTERED), 1, registryfile); 


            printf("Enter choice: ");
            scanf("%d", &choice);
        }while(choice == 1);
    }
        printf("\tCompany Code: %d\t\n", info.compcode);
        printf("\tCustomer ID: %d\t\n", info.custID);
    fclose(registryfile);
}

void SellPetrol(){

    int code = 0, PIN;

    REGISTERED list;
    FILE *registryfile = NULL;
    registryfile = fopen("Sales.dat", "rb");

    if (registryfile == NULL){
        perror("Error: ");
    }
    else{

        printf("Please enter the company code: ");
        scanf("%d", &code);
    //  printf("Please enter the PIN: ");
    //  scanf("%d", &PIN);

        rewind(registryfile);
            fseek(registryfile, (code - 1) * sizeof(REGISTERED), SEEK_SET);
            fread(&list, sizeof(REGISTERED), 1, registryfile); //reads data into list

            fflush(stdin);  
            printf("Company Code: %d\n", list.compcode);
            printf("Company Name: %s\n", list.compname);
            printf("Pin: %d\n", list.pinID);
            printf("Customer ID: %d\n", list.custID);
            printf("ID Type: %s\n", list.IDtype);
            printf("Company ID: %d\n", list.compID);

    }
    fclose(registryfile);
}

最佳答案

看来无论你使用哪种方法来学习 C 都会带来麻烦,因为你所犯的错误似乎很常见。我建议读一本书,比如《K&R2E》……当你偶然发现它们时做练习;在完成它们之前不要继续,如有必要,请提出有关它们的问题。

<小时/>

<强> Don't fflush(stdin) fflush并没有按照你的想法去做。

<小时/>

检查 fopen 等函数的返回值 , scanf , fseek , fread ,甚至 fwrite 。您可能会发现您的freadscanf 返回一个指示失败的值,因此您所说的胡言乱语

<小时/>

Be aware that C uses pass-by-value semantics ONLY 。代码中至少一个错误的根源是对这些语义的误解。即AddUpdate无法修改 main 中声明的变量,因为它收到该变量的副本;此时看来void AddUpdate(REGISTERED info)应该是void AddUpdate(void)info应在AddUpdate内声明.

<小时/>

<强> scanf("%s", &info.compname);可能不会按照您的想法进行操作。 %s指令告诉scanf读取(元语言学上的)用户输入的单词(即,空格分隔的标记),而不是(换行符分隔的标记)。您可能想要int x = scanf("%19[^\n]", info.compname);或者更好的是,char *x = fgets(info.compname, sizeof info.compname, stdin); ...

<小时/>

<强> void main()不可移植,#include <conio.h> 也是如此。 。您可能想要int main(void)并且...您似乎没有使用 <conio.h> 中的任何功能,所以你可能不想要任何东西来代替它。在 C99 中,main没有 return 的函数语句将隐式 return 0;没有发出警告。

关于c - 如何将二进制文件中的特定行读入结构C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43567621/

相关文章:

c - 关于 `ngx_palloc` 的一些问题?

从c中的结构数组创建一个字符串

html - 盒子结构搞砸了

c++ - 将结构成员写入二进制文件并在 C++ 中使用 fstream 读取它们

jquery - 如何通过 JQuery Ajax PUT 方法发送二进制数据

c++ - 将具有 vector 成员的数据结构写入二进制文件

c - .c 源文件消失了,还有希望吗?

c - 访问 .rodata 部分中的特定数据时应用程序崩溃

c - 使用 fork() 创建新进程时写时复制优化的优点

c - 将结构成员输入到 printf 函数中并出现参数过多错误