文件I / O操作。清除结构的元素

时间:2016-09-22 21:32:54

标签: c file fwrite fread

我是一个乞丐,但我基本上创建了一个程序,打开一个包含'部分的二进制文件'结构,读取结构 在数组中,将每个结构的on_hand成员设置为0,然后将结构写回文件。这是我的代码:

invclear.c

/* Modifies a file of part records by setting the quantity
   on hand to a zero for all records */

#include <stdio.h>
#include <stdlib.h>

#define NAME_LEN 25
#define MAX_PARTS 100

struct part {                //size= 36 bytes (2 holes in between number and name[] array
    int number;
    char name[NAME_LEN+1];
    int on_hand;
    }inventory[MAX_PARTS];               

int num_parts;

int main()
{
    FILE *fp;
    int i;

    if((fp=fopen("clear_sample.c", "rb+")) == NULL)
    {
        fprintf(stderr, "Can't open inventory file.\n");
        exit(EXIT_FAILURE);
    }

    num_parts = fread(inventory, sizeof(struct part), MAX_PARTS, fp);    //reads the contents


    for(i=0; i<num_parts; i++)
        inventory[i].on_hand=0;         //clears them

    rewind(fp);                         //sets file position at beggining

    fwrite(inventory,sizeof(struct part), num_parts, fp); 
    fclose(fp);

    return 0;
}

clear_sample.c

#include <stdio.h>
#include <stdlib.h>

#define NAME_LEN 25
#define MAX_PARTS 100

struct part {
    int number;
    char name[NAME_LEN+1];
    int on_hand;
    }inventory[MAX_PARTS]={0};


int main()
{
    int i;
    int num_parts;

    for(i=1;i<=15;i++)
        inventory[i].on_hand=i;

    for(i=1;i<=15;i++)
        printf("%d\n",inventory[i].on_hand);

    return 0;
}

它运行没有错误但很遗憾它没有将on_hand变量清除为0,实际上它几乎删除了整个文件。这是我修改过的 clear_sample.c 文件:

#include <stdio.h>
#include <st

我非常感谢任何关于我为什么做错的想法。

1 个答案:

答案 0 :(得分:2)

您使用的任何工具都会误导您检查生成的文件。它不是

#include <stdio.h>
#include <st

实际上它是

#include <stdio.h>
#include <std^@^@^@^@h>

#define NAME_LEN 25
#define ^@^@^@^@PARTS 100

struct part {
    int^@^@^@^@ber;
    char name[NAME_LEN+1];
^@^@^@^@int on_hand;
    }inventory[MAX_^@^@^@^@S]={0};


int main()
{
    int i^@^@^@^@  int num_parts;

    for(i=1;i<^@^@^@^@i++)
        inventory[i].on_han^@^@^@^@

    for(i=1;i<=15;i++)
       ^@^@^@^@ntf("%d\n",inventory[i].on_hand)^@^@^@^@   return 0;
}

所有^@都是二进制零字节,对应于您放入on_hand的零。

如评论中所述,要测试您的程序,请准备一个符合您期望格式的文件。