keivn
keivn

Reputation: 114

c fwrite() writing data only right one of the struct variable?

This function is supposed to get a parameter as the pointer of a file and put all file into the struct anagram, then write it to another file. Right now the data only contains a.word, but it suppose to containst a.sorted too?

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include "anagrams.h"


void buildDB ( const char *const dbFilename ) 
{
    FILE *dict, *anagramsFile;
    struct anagram a;

    //check if dict and anagram.data are open
    errno=0;
    dict= fopen(dbFilename, "r");

    if(errno!=0) {
        perror(dbFilename);
        exit(1);
    }

    errno=0;

    anagramsFile = fopen(anagramDB,"wb");

    char word[SIZE];
    char *pos;
    int i=0;

    while(fgets(word, SIZE, dict) !=NULL) {

        //get ripe of the '\n'
        pos=strchr(word, '\n');
        *pos = '\0';

        strncpy(a.word,word,sizeof(word));
        //lowercase word
        int j=0;
        while (word[j]) {
            tolower(word[j]);
            j++;
        }

        /* sort array using qsort functions */ 
        qsort(word,strlen(word), 1, charCompare);

        strncpy(a.sorted,word,sizeof(word));

        fwrite(&a,1,sizeof(word),anagramsFile);

        i++;
    }
    fclose(dict);
    fclose(anagramsFile);

}

data:

enter image description here

Upvotes: 0

Views: 401

Answers (1)

hammar
hammar

Reputation: 139930

char word[SIZE];
...
fwrite(&a,1,sizeof(word),anagramsFile);

sizeof(word) returns the full size of the buffer, so you're writing the full length of the buffer each time. You'll want to use strlen() or similar to only write the part of the buffer you're actually using.

Upvotes: 3

Related Questions