Search code examples
c++cfwritefread

Having issues with fread and fwrite when writing some characters and a struct to a file and reading them back


I want to write three characters to a file, then a struct, then one more character. Finally I would like to read the character before the struct, the struct itself, the character after the struct and display them on the screen.

 struct stuff{
   int a;
   int b;
};

int main(){

  FILE * fp = fopen("input.txt", "w+");
  char charA = 'z';
  char charB = 's';
  char charC = 'q';
  char charD = 'e';

  //create a struct of type stuff
  stuff s;
  s.a = 123;
  s.b = 2111;

 //fwrite three first chars
  fwrite(&charA, 1, sizeof(char), fp);
  fwrite(&charB, 1, sizeof(char), fp);
  fwrite(&charC, 1, sizeof(char), fp);
  //fwrite the struct
  fwrite(&s, 1, sizeof(struct stuff), fp);
  //fwrite the last char
  fwrite(&charD, 1, sizeof(char), fp);

  //read the char before the struct, the struct itself,
  // and the char after the struct
  char expectedCharC;
  stuff expectedStructS;
  char expectedCharD;

  fseek(fp, sizeof(struct stuff) + sizeof(char), SEEK_END);
  fread(&expectedCharC, 1, sizeof(char), fp);
  fread(&expectedStructS, 1, sizeof(struct stuff), fp);
  fseek(fp, sizeof(char)*3 + sizeof(struct stuff), SEEK_SET);
  fread(&expectedCharD, 1, sizeof(char), fp);

  cout<<expectedCharC<<" "<<expectedStructS.a<<" ";
  cout<<expectedStructS.b<<" "<<expectedCharD<<endl;

  fclose(fp);

  return 0;
}

Instead of this result:

q 123 2111 e

I get this result:

4197174 0 e

I don't know what I'm doing wrong. I'm writing bytes to the file, reading them back and displaying them on the screen. What goes wrong?

thank you in advance


Solution

  • Wow, lots of problems in your code. Let's tackle them one by one.

    1. As mentioned by unwind, the mode you're using to open the file seems to be incorrect as to what you're trying to do. For one, you're trying to read from a file that is opened for write-only.

    2. You're using fwrite wrongly. It goes fwrite(pointer to data, size of each data, number of data, FILE pointer);.

    3. You're using fseek wrongly. I see you're confused with the offset parameter. This offset defines a signed distance from the origin specified as the last argument to fseek. Therefore, if you're at SEEK_END, you should be moving backwards by having your offset be a negative number.

    I've done these changes myself and now it works. Output: q 123 2111 e

    Here's a nice little website for you too. Helped me with your problem.

    Thank you for reading.