'Trying to read a file in chunks but can't read it in linear order?

So I'm trying to read an input file called f1 in chunks of 128 bytes. After reading the first 128 chars I move the pointer using sleek() to 129th char, but it still only reads the first 128 chars. Could you tell me what I'm doing wrong? After reading the chars, I want to store them in myBufferPointer.

This is how I create the bufferpointer in the shared memory.

 /* name of the shared memory buffer */
char* myBuffer = "MyBuff"; 
/* shared memory file descriptor  */
int myBufferFileDesc;
/* pointer to shared memory obect */
char *myBufferPointer;
/* create the shared memory object */

myBufferFileDesc = shm_open(myBuffer,O_CREAT | O_RDWR,0666);
/* configure the size of the shared memory object */
// the size here will be buffer size * chunk size 
ftruncate(myBufferFileDesc, 3072);
/* memory map the shared memory object */
myBufferPointer = (char *)
mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, myBufferFileDesc, 0);

The goal is to write a input file into the shared memory using read().

   int next_produced;
   char tempBuffer[128];
   string str;

   next_produced = read(f1, tempBuffer, 128);

   myBufferPointer += tempBuffer;

       

   printf("The conents of buffer the first time are %s\n", myBufferPointer);

 
   lseek(f1, 129, SEEK_CUR);
   read(f1, tempBuffer, 128);

   myBufferPointer += tempBuffer;



   printf("The conents of second time are %s\n", myBufferPointer);


Solution 1:[1]

It seems that you are expecting this

myBufferPointer += tempBuffer;

to copy the read data to myBufferPointer. It will not

Since you dont show what myBufferPointer is I am going to gues that its like this

char buffer[1000];
char * myBufferPointer = buffer;

What you should do is this

next_produced = read(f1, myBufferPointer, 128); // read into buffer
myBufferPointer +=  next_produced;              // move pointer up by amount read

next_produced = read(f1, myBufferPointer, 128); // read into buffer
myBufferPointer +=  next_produced;              // move pointer up by amount read

Note that you dont need to seek if you just wan tth enext chunk

Remeber that if you want to printf this like a string you need to zero terminate it, read will not do that for you.

Solution 2:[2]

Look at this sample that tries to do what you describe. It might help you see better, how operators and some standard calls work in C.

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

int main() {
   const size_t bufferSize = 128;
   const int chunkCount = 7;

   char fileName[] = "tpm.txt";
   char tempBuffer[bufferSize + 1] = {0,};

   /* Create sample input file */
   FILE* f1 = fopen(fileName,"wb");
   if (!f1) {
      printf("Cannot open file \"%s\" for writing.\n", fileName);
      exit(1);
   }

   printf("* Writing %d chunks of %lld bytes to \"%s\".\n\n",chunkCount,bufferSize,fileName);

   for (int i=1;i<= chunkCount;i++) {
      memset(tempBuffer, '0'+i, bufferSize );
      fwrite(tempBuffer, sizeof(char), bufferSize, f1);
   }
   fclose(f1);

   /* Read back input file */
   f1 = fopen(fileName, "rb");
   if (!f1) {
      printf("Cannot open file \"%s\" for reading.\n", fileName);
      exit(1);
   }

   printf("* Reading %lld byte chunks from \"%s\".\n\n", bufferSize, fileName);

   size_t next_produced=1;
   memset(tempBuffer, '0', bufferSize);
   tempBuffer[bufferSize] = 0;

   for (int i = 1; ; i++) {
      next_produced = fread(tempBuffer, sizeof(char), bufferSize, f1);
      
      if ( 0 >= next_produced )
         break;

      printf("The contents of buffer are:\n%s\n", tempBuffer);
   }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 pm100
Solution 2 Laszlo