简体   繁体   English

写入两个不同的txt文件

[英]Writing to two different txt files

#include "aservelibs/aservelib.h"
#include <stdio.h>
#include <math.h>
#include <string.h>

FILE *textFilePointer;
FILE *textFilePointer2;


typedef struct
{
    int notes;
    int velocity;
}NoteData;


void notetofile (NoteData input, int seqlen, int reclayer);

int main()
{

    int count, count2, note, vel = 0;
    char choice = 'y';
    struct layers;
    int reclayer = 1;
    int playlayer = 1;
    char choice2 = 'y', choice3 = 'y';
    int seqlen = 16;
    NoteData input;




    printf("Welcome To Jonny Maguire's Midi record and playback application. Please Select one of the following options...\n\n");
    aserveSay("Welcome To Jonny Maguires Midi record and playback application. Please Select one of the following options");
    aserveSleep(8000);
    while(choice != 'x')
    {



        printf("r to Record\np to Playback\nx to exit the program\n");
        aserveSay("choose r, to record a sequence, p, to playback your recording. Or select x, at any time to exit the program");

        scanf(" %c", &choice);

        if(choice == 'r')
        {
            while(choice2 != 'n')
            {
                aserveSay("you have chosen to record, enter the no. of notes you wish to record");
                printf("You have chosen to record, enter the no. of notes you wish to record \n\n");
                scanf(" %d", &seqlen);
                printf("Please play %d notes", seqlen);



                    textFilePointer = fopen("recording1.txt", "w");

                    textFilePointer2 = fopen("recording2.txt", "w");



                if(textFilePointer == NULL or textFilePointer2 == NULL)
                {
                    printf("Error Opening File!");
                }
                else
                {



                    //Recording 16 note data into txt file

                    notetofile(input, seqlen, reclayer);
                    printf("Would you like to record another layer?");
                    scanf(" %c", &choice2);



                }
                reclayer++;
            }
        }
            else if (choice == 'p')
            {

                while(choice3 != 'n')
                {
                    //If P is selected, playback of the txt file
                    printf("which sequence would like to playback? 1, 2 or both (3)?");
                    scanf(" %d", &playlayer);


                        textFilePointer = fopen("recording1.txt", "r");

                       // textFilePointer2 = fopen("recording2.txt", "r");



                    if(textFilePointer == NULL)
                    {
                        printf("Error Opening File!");
                    }

                    //read until end of file and convert frequency
                    if (playlayer == 1)
                    {
                    while(!feof(textFilePointer))
                    {
                        float frequency;
                        float amplitude = vel/127.0;

                        fscanf(textFilePointer, " %d %d\n", &input.notes, &input.velocity);
                        printf(" %d %d\n\n", input.notes, input.velocity);

                        frequency = 440 * pow(2, (note-69) /12.0);

                        aserveOscillator(0, frequency, amplitude, 0);
                        aserveSleep(500);
                        aserveOscillator(0, 0, 0, 0);
                    }
                    }
                }
                fclose(textFilePointer);
                playlayer++;
            }
        }

    return 0;
}

//function to write notes to file
void notetofile(NoteData input, int seqlen, int reclayer)
{
    for (int count = 1; count <= seqlen;)
    {

        input.notes = aserveGetNote();
        input.velocity = aserveGetVelocity();



        //only note on messages are sent to file
        if(input.velocity > 0)
        {
            printf("reclayer = %d\n", reclayer);
            if(reclayer == 1)
            {
                printf("test");
              fprintf(textFilePointer, " %d %d\n", input.notes, input.velocity);
                fprintf(textFilePointer, "test");
            }
            else if(reclayer == 2)
            {
                fprintf(textFilePointer2, " %d %d\n", input.notes, input.velocity);

            }

            printf("%d %d\n", input.notes, input.velocity);
            count++;
        }
    }

}

This program is meant to read midi notes, write them to a txt file and then read from file into an oscillator. 该程序用于读取Midi笔记,将它们写入txt文件,然后从文件中读取到振荡器。 fprintf is not writing to file in the 'notestofile' function. fprintf不在'notestofile'函数中写入文件。 It maybe because I have two textFilePointers open at the same time. 可能是因为我同时打开了两个textFilePointers。

When you write to the 2 files recording1.txt and recording2.txt, you don't append so theses files are reset each time you want to write. 当您写入2个文件recording1.txt和recording2.txt时,您无需追加,因此每次要写入时都会重置这些文件。 If you want to append you have to use mode "a" (for append) instead of "w". 如果要追加,则必须使用模式“ a”(用于追加)而不是“ w”。

And when you are are writing theses files, both file descriptors textFilePointer and textFilePointer2 are never closed and the buffer is not explicitly flushed so you don't see the content in the file while your process is alive. 而且,当您编写这些文件时,文件描述符textFilePointertextFilePointer2都不会关闭,并且缓冲区也不会显式刷新,因此在进程运行时不会在文件中看到内容。 A call to fclose on theses file descriptors will flushed write buffers like this in your code: 对这些文件描述符的fclose调用将刷新代码中的写入缓冲区,如下所示:

            textFilePointer = fopen("recording1.txt", "w");
            textFilePointer2 = fopen("recording2.txt", "w");

            if(textFilePointer == NULL or textFilePointer2 == NULL)
            {
                printf("Error Opening File!");
            }
            else
            {
                //Recording 16 note data into txt file
                notetofile(input, seqlen, reclayer);
                printf("Would you like to record another layer?");
                scanf(" %c", &choice2);

                //Added fclose calls to opened files:
                fclose( textFilePointer );
                fclose( textFilePointer2 );
                //TODO Check both fclose return values
            }

If you don't close files, it is a file descriptors leak and on most Linux systems the limit of maximum opened files is set to 1024, type ulimit -n to see it. 如果不关闭文件,这是文件描述符泄漏,并且在大多数Linux系统上,最大打开文件的限制设置为1024,请键入ulimit -n进行查看。

You can see opened descriptors on a living process to see a leak with the lsof command or by listing /proc/<pid>/fd directory. 您可以使用lsof命令或通过列出/proc/<pid>/fd目录来查看正在运行的进程中打开的描述符,以查看泄漏。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM