0

私はCプログラミングに不慣れです。文字列をテキストファイルに書き込む循環バッファを作成したいと思います。

#include <stdio.h>
#include <malloc.h>

// Buffer writer header files
#include <stdlib.h>

typedef struct { char value; } ElemType;

/* Circular buffer object */
typedef struct {
    int         size;   /* maximum number of elements           */
    int         start;  /* index of oldest element              */
    int         end;    /* index at which to write new element  */
    ElemType   *elems;  /* vector of elements                   */
} CircularBuffer;

void cbInit(CircularBuffer *cb, int size);
void cbFree(CircularBuffer *cb);
int cbIsFull(CircularBuffer *cb);
int cbIsEmpty(CircularBuffer *cb);
void cbWrite(CircularBuffer *cb, ElemType *elem);
void cbRead(CircularBuffer *cb, ElemType *elem);
void writeFile();


void cbInit(CircularBuffer *cb, int size) {
    cb->size  = size + 1; /* include empty elem */
    cb->start = 0;
    cb->end   = 0;
    cb->elems = (ElemType *)calloc(cb->size, sizeof(ElemType));
}

void cbFree(CircularBuffer *cb) {
    free(cb->elems); /* OK if null */ }

int cbIsFull(CircularBuffer *cb) {
    return (cb->end + 1) % cb->size == cb->start; }

int cbIsEmpty(CircularBuffer *cb) {
    return cb->end == cb->start; }

/* Write an element, overwriting oldest element if buffer is full. App can
   choose to avoid the overwrite by checking cbIsFull(). */
void cbWrite(CircularBuffer *cb, ElemType *elem) {
    cb->elems[cb->end] = *elem;
    cb->end = (cb->end + 1) % cb->size;
    if (cb->end == cb->start)
        cb->start = (cb->start + 1) % cb->size; /* full, overwrite */
}

/* Read oldest element. App must ensure !cbIsEmpty() first. */
void cbRead(CircularBuffer *cb, ElemType *elem) {
    *elem = cb->elems[cb->start];
    cb->start = (cb->start + 1) % cb->size;
}

int mainSecond(int argc, char **argv) {
    CircularBuffer cb;
    ElemType elem = {0};

    int testBufferSize = 10; /* arbitrary size */
    cbInit(&cb, testBufferSize);

    /* Fill buffer with test elements 3 times */
    for (elem.value = 0; elem.value < 3 * testBufferSize; ++ elem.value)
        cbWrite(&cb, "AC");

    /* Remove and print all elements */
    while (!cbIsEmpty(&cb)) {
        cbRead(&cb, &elem);
        printf("%d\n", elem.value);
    }

    cbFree(&cb);
    return 0;
}



int main(int argc, char** argv) {

    writeFile();

    return 0;
}

// write to file function

void writeFile() {

    FILE *file;
    file = fopen("file.txt", "a+"); /* apend file (add text to a file or create a file if it does not exist.*/

    CircularBuffer cb;
    ElemType elem = {0};

    int testBufferSize = 10; /* arbitrary size */
    cbInit(&cb, testBufferSize);

    /* Fill buffer with test elements 3 times */
    for (elem.value = 0; elem.value < 3 * testBufferSize; ++ elem.value)
        cbWrite(&cb, "test");

    /* Remove and print all elements */
    while (!cbIsEmpty(&cb)) {
        cbRead(&cb, &elem);
        fprintf(file, "%d\n", elem.value);
       // printf("%d\n", elem.value);      
    }   

    // write something into the file
    fprintf(file, "%s", "Test!\n");
    // close the file
    fclose(file); 
    //getchar(); /* pause and wait for key */
    cbFree(&cb);
}

問題は、文字列を循環バッファに挿入し、その後テキストファイルに書き込む方法です。この実装は数値でのみ機能します。

4

1 に答える 1

2

次の 2 つの方法があります。

  1. 循環バッファーにポインターを挿入します。文字列をメモリのどこかに保存します。次に、メモリ内のその場所へのポインターを取得し、それを循環バッファーに格納します。

  2. 文字を連結すると文字列になるような方法で、文字を循環バッファーに格納します。これは、文字列がバッファにコピーされ、文字列を構成するのに十分な数の文字をバッファから読み取る何らかの方法が必要であることを意味します。

于 2012-06-28T15:01:44.383 に答える