पर स्ट्रेटिंग स्ट्रक्चर को मैप किए गए मेमोरी फ़ाइल में स्ट्रक्चर लिखने में समस्या है।मैप किए गए मेमोरी फ़ाइल (एमएमएपी)
मेरे पास दो फ़ाइल हैं mmap.write.c और mmap.read.c, और इन फ़ाइलों में, मैं एक फ़ाइल को एक पूर्णांक लिख रहा हूं और इसे फ़ाइल से पढ़ रहा हूं।
जब मैं struct लिख सकते हैं और इसे पढ़ने के लिए चाहते हैं, तो मैं mmap.write.c की लाइन 32 में के बाद से उस के बारे में नहीं सोच सकता है
sprintf((char*) file_memory, "%d\n", i);
और mmap.read.c की लाइन 25 में
sscanf (file_memory, "%d", &integer);
पूर्णांक/डबल/फ्लोट/चार इत्यादि लिखने और पढ़ने में कोई अंतर नहीं है क्योंकि मैं पूर्णांक के लिए पैटर्न को "% d" के रूप में रख सकता हूं। लेकिन संरचना को इंगित करने के लिए मैं यहां क्या लिखूंगा? यह मेरी मुख्य समस्या है।
struct है कि मैं लिख सकते हैं और पढ़ना चाहते हैं:
#define CHANNELS 20
typedef dataholder struct {
int value[CHANNELS];
time_t time;
int hash;
}dataholder;
mmap.read.c
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include "mmap.h"
#define FILE_LENGTH 0x10000
int main (int argc, char* const argv[])
{
int fd;
void* file_memory;
int integer;
/* Open the file. */
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR);
printf("file opened\n");
/* Create the memory mapping. */
file_memory = mmap (0, FILE_LENGTH, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
printf("memfile opened\n");
close (fd);
printf("file closed\n");
/* Read the integer, print it out, and double it. */
while(1) {
sscanf (file_memory, "%d", &integer);
printf ("value: %d\n", integer);
usleep(100000);
}
//sprintf ((char*) file_memory, "%d\n", 2 * integer);
/* Release the memory (unnecessary because the program exits). */
munmap (file_memory, FILE_LENGTH);
return 0;
}
mmap.write.c
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#include "mmap.h"
#define FILE_LENGTH 0x10000
/* Return a uniformly random number in the range [low,high]. */
int random_range (unsigned const low, unsigned const high)
{
unsigned const range = high - low + 1;
return low + (int) (((double) range) * rand()/(RAND_MAX + 1.0));
}
int main (int argc, char* const argv[])
{
int fd, i;
void* file_memory;
/* Seed the random number generator. */
srand (time (NULL));
/* Prepare a file large enough to hold an unsigned integer. */
fd = open (argv[1], O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
//lseek (fd, FILE_LENGTH+1, SEEK_SET);
write (fd, "", 1);
//lseek (fd, 0, SEEK_SET);
/* Create the memory mapping. */
file_memory = mmap (0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);
/* Write a random integer to memory-mapped area. */
for(i=0; i<10000; i++) {
sprintf((char*) file_memory, "%d\n", i);
//goto a;
usleep(100000);
}
a:
/* Release the memory (unnecessary because the program exits). */
munmap (file_memory, FILE_LENGTH);
return 0;
}
धन्यवाद अग्रिम में एक बहुत ।
मैं दूसरा तरीका पसंद है आपने प्रदान किया, सरल और आसान करना। चूंकि मैं इसे एक एम्बेडेड सिस्टम में उपयोग करता हूं, वहां कोई गारंटी नहीं है कि पर्याप्त जगह है। फिर से धन्यवाद। – totten