Rasmi Ranjan Nayak
Rasmi Ranjan Nayak

Reputation: 11948

Why the output the program is something different?

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

int main()
{
    FILE *fp;
    char ch;
    char buffer[80] ;
    fp = fopen("c:\\Rasmi Personal\\hello.txt", "w");

    if(fp == NULL)
    {
        printf("File not found");
        exit(1);
    }
    else
    {
        while(1)
        {
            gets(buffer);
            fwrite(buffer, strlen(buffer), 2, fp); /* I made, size_t nitems = 2 (third element/argument)*/
            fwrite("\n", 1, 1, fp);
        }

    }

    fclose(fp);

    return 0;
}

Input:

Rasmi Ranjan Nayak

Output:

Rasmi Ranjan Nayak      0@ ÿ" 8ÿ" 

Why this garbage is coming.

According to fwrite() function. if the size_t nitems is more than 1 then the entered text will be written more than once. But here why I am getting garbage?

Upvotes: 0

Views: 75

Answers (2)

unwind
unwind

Reputation: 399803

You're telling fwrite() to write two times strlen(buffer) bytes from the buffer (by setting nmemb = 2 you're making it write two "objects", each of which is strlen(buffer) bytes long), so it reads twice the number of bytes that are actually present.

The "garbage" is simply whatever happens to appear in memory after the string ends in buffer.

This is broken code, nmemb should be 1.

Upvotes: 4

Tiago Peczenyj
Tiago Peczenyj

Reputation: 4623

The signature of fwrite function is

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

ptr
  Pointer to the array of elements to be written.
size
  Size in bytes of each element to be written.
count
  Number of elements, each one with a size of size bytes.
stream
  Pointer to a FILE object that specifies an output stream.

In this case, if you try to write count * size who is bigger (in bytes) than the original string you have this garbage. If you clean the buffer

memset(buffer,0,80*sizeof(char));
gets(buffer);

probably will see a different result

$ ./a.out
asdadsadasdsad

$ cat -v hello.txt 
asdadsadasdsad^@^@^@^@^@^@^@^@^@^@^@^@^@^@

but the text is always writen once. the difference is how many bytes will be writen

Upvotes: 1

Related Questions