1

テキスト ファイルを読み取り、すべてのファイル コンテンツをメッセージ キューに送信し、コンソールに表示するプログラムを作成しました。私が持っているテキスト ファイルのサイズは、30kb から 30mb の範囲です。現在、私のプログラムは最大 1024 バイトしか読み取ることができません。すべてのファイルの内容を読み取るには、MAX をいくつに設定すればよいですか? それとも別の場所に問題がありますか?お知らせ下さい。よろしくお願いいたします。

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#define MAX 1024    //1096

//Declare the message structure
struct msgbuf
{
    long type;
    char mtext[MAX];
};


//Main Function
int main (int argc, char **argv)
{
    key_t key;      //key to be passed to msgget()
    int msgid;      //return value from msgget()
    int len;
    struct msgbuf *mesg;  //*mesg or mesg?
    int msgflg = 0666 | IPC_CREAT;
    int fd;
    char buff[MAX];


    //Initialize a message queue
    //Get the message queue id
    key = ftok("test.c", 1);
    if (key == -1)
    {
        perror("Can't create ftok.");
        exit(1);
    }

    msgid = msgget(key, msgflg);
    if (msgid < 0)
    {
        perror("Cant create message queue");
        exit(1);
    }

    //writer
    //send to the queue
    mesg=(struct msgbuf*)malloc((unsigned)sizeof(struct msgbuf));
    if (mesg == NULL)
    {
        perror("Could not allocate message buffer.");
        exit(1);
    }

    //set up type
    mesg->type = 100;

    //open file
    fd = open(argv[1], O_RDONLY);

    while (read(fd,buff,sizeof(buff))>0)
    {
        //printf("%s\n", buff);
        strcpy(mesg->mtext,buff);
    }


    if(msgsnd(msgid, mesg, sizeof(mesg->mtext), IPC_NOWAIT) == -1)
    {
        perror("Cant write to message queue");
        exit(1);
    }


    //reader
    int n;

    while ((n=msgrcv(msgid, mesg, sizeof(mesg->mtext), 100, IPC_NOWAIT)) > 0)
    {
        write(1, mesg->mtext, n);
        printf("\n");

    }

    //delete the message queue
    msgctl(msgid,IPC_RMID,NULL);

    close(fd);

}
4

2 に答える 2

1

バッファを使用する場合、処理したいデータの最も意味のある量を表す最小サイズを選択することをお勧めします。構築しているアーキテクチャの単語サイズのチャンクの倍数を読み取るのが一般的です。

ただし、大量のバイトを読み取ってスタックに格納することは非常に悪いことです。これは、スタック オーバーランの影響を非常に受けやすくなります。メモリに保存する必要がある場合、最大のスペースはメモリ プールになります。これを回避するための秘訣があります: (ファイル全体ではなく) 一度に意味のある量のバイトを処理します。ここで、動的配列またはその他の ADT のアイデアが登場します。

「ファイルを読み取ってコンソールに出力する」という特定のケースでは、実際には思ったよりもはるかに簡単です。一度に 1 バイトずつ読み取っEOFて に出力できstdoutます。キューなどは必要ありません。

編集:あなたの要求に応じて、私が提案した解決策の例:

for ( int byte = getchar(); byte != EOF; byte = getchar() ) {
  printf( "%c", byte );
}

...そして、それだけです。一度に 1 バイトずつ処理するだけです。次に、テキスト ファイルをプログラムにパイプします。

./program < textfile.txt
于 2013-08-11T20:14:11.807 に答える