2023年5月4日 星期四

Fafa的奇妙冒險

 Week 12

檔案讀寫

Week 12-1.1

Step 1:先開啟CodeBlock並開啟Empty file,並將此程式檔案儲存

Step 2:將下列程式碼複製進CodeBlock中
程式碼:
#include<stdio.h>
int main()
{
    FILE * fout=fopen("file.txt","w");
    printf("Hello World");
    fprintf(fout,"Hello World在檔案裡\n");
}

程式碼解釋:
FILE *fout=fopen("file.txt","w");
此段為 設一個指標(*fout),此指標的型態為FILE(檔案),因此fout為【檔案指標】
此指標會被初始化為:
(1)fopen:開啟一個檔案 (f為file檔案的意思)
(2)fopen()此函式的格式為:fopen("檔名","模式")
    檔名:如果此檔案存在於當前目錄則會開啟此檔,若不存在則會創建一個新的檔案
    模式:開啟此檔的模式
(3)fprintf():此函式格視為:fprintf(被寫入的檔案變數,"欲寫入的資料")


Week 12-1.2

Step 1:開啟New Empty File,並將檔案儲存
Step 2:將下列程式碼複製進並貼上
程式碼:
#include<stdio.h>
int main()
{
    char line[20];
    FILE *fin = fopen("file.txt","r");
    fscanf(fin,"%s",line);
    printf("讀到了:%s\n",line);
    fscanf(fin,"%s",line);
    printf("讀到了:%s\n",line);
}

程式碼解釋:

fscnaf()函式格式為:fscanf(要被讀取的檔案變數,"資料型態",要存入的變數)
fscanf()會將檔案讀取到的資料,讀入此程式中,以便程式加以利用

Week 12-1.3

Step 1:將下列程式碼複製進New Empty File

程式碼:
#include<stdio.h>
int main()
{
    int a[10]={10,20,30,40,50,60,70,80,90,100};
    FILE * fout=fopen("file3.txt","w");
    for(int i=0;i<10;i++)
    {
        fprintf(fout,"%d ",a[i]);  //切記:一定要打"%d "空格一定要加,不然儲存的資料會連再一起
        printf("%d ",a[i]);
    }
    fclose(fout);

    int b[10];
    FILE *fin=fopen("file3.txt","r");
    for(int i=0;i<10;i++)
    {
        fscanf(fin,"%d",&b[i]);///讀到b陣列b[i]裡面
        printf("%d ",b[i]);
    }
    fclose(fin);
}


程式碼解釋:

fclose()函式格式為:fclose(檔案變數)
fclose()會關閉檔案變數開啟的檔案,關閉後便不可再存取該變數
fscanf(fin,"%d",&b[i])此行為:fscanf()先以fin檔案變數存取檔案,將讀到的整數資料(%d)存入b[i]的位置中

fopen()的模式參數:

fopen()有6種參數:"r"、"w"、"a"、"+"、"b"、"t"

r:以【唯讀】的模式打開,且該檔案必須存在

w:將文件以【唯寫】的模式打開,若該檔案存在則長度會被清0(刪去先前所寫的內容),若該文件不存在則會創建一個新的

a:以追加的方式開啟該檔案,若檔案不存在則會創建一個新的;如果檔案存在,則被寫入的數據會追加至原本檔案的最後,即:文件內容會被保留

r+:以可讀寫的方式開啟檔案,該檔案必須存在

w+:打開可讀寫檔案,若該檔案存在則長度清0(刪去原先的內容),若該文件不存在則會創建一個新的

a+:以附加的方式開啟該檔案,若檔案不存在則會建立該檔案;若檔案存在則會保留原本的檔案內容,新寫入的內容會被自動追加至該檔案的最後

rb:【唯讀】的模式打開一個二進位的檔案,只允許讀資料

wb:【唯寫】的模式打開一個二進位的檔案,只允許寫入資料

ab:追加打開一個二進位文件,並在檔案末尾處寫入資料

rb+:讀寫模式打開一個二進位的檔案,雲許讀寫資料,檔案必須存在

wb+:讀寫模式打開或建立一個二進位的檔案,允許讀和寫

ab+:讀寫打開一個二進位檔案,允許讀或式在檔案末端增加數據

rt:【唯讀模式】打開一個txt檔案,只允許讀取資料

wt:【唯寫模式】打開或建立一個txt檔案,只允許寫入資料

at:追加打開一個txt檔案,並在檔案末端寫入資料

rt+:讀寫模式打開一個txt檔案,允許讀寫

wt+:讀寫模式打開或建立一個txt檔案,允許讀寫

at+:讀寫模式打開一個txt檔案,允許讀或是在檔案末端增加數據

總結:
b為:打開方式是否為二進位

讀寫模式分為下列數種:唯讀、唯寫、讀寫、追加只寫(a)、追加讀寫(a+)

+表示:允許讀寫

a表示:追加寫入(寫在檔案最末端)

t:以文件檔(txt檔)開啟一個檔案











Week 12-2.1

Step 1:開啟CodeBlock並開啟GLUT project

Step 2:將下列程式碼複製並貼上CodeBlock
程式碼:
#include<stdio.h>
#include<GL/glut.h>
float teapotX=0,teapotY=0;
FILE *fout=NULL;
FILE *fin=NULL;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(teapotX,teapotY,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void mouse(int button,int state,int x,int y)
{
    teapotX=(x-150)/150;
    teapotY=(150-y)/150;
    if(state==GLUT_DOWN)
    {
        if(fout==NULL)fout=fopen("file4.txt","w");

        fprintf(fout,"%f %f\n",teapotX,teapotY);
    }
    display();
}
void keyboard(unsigned char key,int x,int y)
{
    if(fin==NULL){
        fclose(fout);
        fin = fopen("file.txt","r");
    }
    fscanf(fin,"%f%f",&teapotX,&teapotY);
    display();
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week12");

    glutDisplayFunc(display);
    glutMouseFunc(mouse);

    glutMainLoop();
}

Week 12-2.2


Step 1:開啟CodeBlock並開啟GLUT project

Step 2:將下列程式碼複製並貼上
#include <stdio.h>
#include <GL/glut.h>
float teapotX=0,teapotY=0;
FILE * fout =NULL;
FILE * fin =NULL;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glTranslatef(teapotX,teapotY,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
}
void  mouse(int button,int state,int x,int y)
{
    teapotX=(x-150)/150.0;
    teapotY=(150-y)/150.0;
    if(state==GLUT_DOWN){
        if(fout==NULL)
            fout=fopen("file4.txt","w");
            fprintf(fout,"%f %f\n",teapotX,teapotY);
    }
    display();
}
void keyboard(unsigned char key,int x,int y)
{
    if(fin==NULL){
        fclose(fout);
        fin=fopen("file4.txt","r");
        }
        fscanf(fin,"%f%f",&teapotX,&teapotY);
        display();
}
int main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("week12");

    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);

    glutMainLoop();
}
上述加底線的程式碼為:從Week12-2.1複製過來的程式碼中新增的部分,此部分讓file4.txt可以記錄移動到的點
file4.txt在freeglut/bin中


要把執行目錄改變:
Step 1:點選選單的Project-Properites...




Step 2:點選Build target







Step 3:將Execution working dir改為欲設定的執行目錄即可






PS:若只輸入個".",則會將working dir設為【目前的目錄


更改目錄後要將freeglut.dll複製進當前目錄喔



freeglut.dll在freeglut/bin目錄中

將freeglut.dll複製進當前資料夾(與main.exe執行檔相同目錄中)

執行成功!



Week 12-3

Step 1:創建一個GLUT project

Step 2:把上一個程式碼複製進去

Step 3:把資料夾名稱改成:Final_project

Step 4:打開CodeBlock,並對Final_project點開右鍵,並點選Properties...
                或是上面的Project-Properties...也可









Step 5:Title要為:Final_project








沒有留言:

張貼留言