2016年9月27日 星期二

給新手的C++教學 (上冊) - 13 - 9. 進階的檔案處理

回到「給新手的C++教學 (上冊)」

回到「13. 額外語法 (Extra syntax)」

上一頁

讀取檔案「in.txt」並同時輸出其內容:

#include<cstdio>
int main()
{
    FILE *file_reader=fopen("in.txt","r");
    for(char c;fscanf(file_reader,"%c",&c)==1;)
    {
        printf("%c",c);
    }
    return 0;
}
輸出結果:可以發現黑色視窗上輸出的內容就是「in.txt」的內容

輸入3個檔名,依據輸入的檔名讀取那3個檔案並同時輸出其內容:

#include<cstdio>
void ReadFile()
{
    char file_name[1000];
    scanf("%s",file_name);
    FILE *file_reader=fopen(file_name,"r");
    for(char c;fscanf(file_reader,"%c",&c)==1;) printf("%c",c);
    printf("Finish reading %s!\n",file_name);
}
int main()
{
    ReadFile();
    ReadFile();
    ReadFile();
    return 0;
}
可以隨時決定要從哪一個檔案讀取資料 (fscanf) 或者直接從黑色視窗取得輸入 (scanf)

將「1+2+3+......+100」的完整計算過程寫入到檔案「out.txt」:



#include<cstdio>
int main()
{
    FILE *file_writer=fopen("out.txt","w");
    int ans=1;
    for(int i=2;i<=100;i++)
    {
        fprintf(file_writer,"%d+%d=%d\n",ans,i,ans+i);
        ans=ans+i;
    }
    return 0;
}

計算過程這麼多,當然請程式來幫忙產生啊XD

將「1+2+3+......+10000」的完整計算過程寫入到檔案「process.txt」,並將結果寫入到檔案「result.txt」且輸出到黑色視窗:

#include<cstdio>
int main()
{
    FILE *process_file=fopen("process.txt","w");
    int ans=1;
    for(int i=2;i<=10000;i++)
    {
        fprintf(process_file,"%d+%d=%d\n",ans,i,ans+i);
        ans=ans+i;
    }
    FILE *result_file=fopen("result.txt","w");
    fprintf(result_file,"The result is %d\n",ans);
    printf("The result is %d\n",ans);
    return 0;
}
計算過程太多了,不想輸出到黑色視窗,寫入檔案是另外一種選擇~
計算完成後會同步在黑色視窗和另外一個檔案裡面顯示計算結果

當然,檔案處理還包刮「刪除、移動或重新命名」等操作
刪除「process.txt」後將「result.txt」重新命名為「result-renamed.txt」:

#include<cstdio>
int main()
{
    remove("process.txt");
    rename("result.txt","result-renamed.txt");
    return 0;
}
如果程式失控產生上千個檔案,可以自己再用程式把它們刪光光

如果需要更進階的檔案管理功能 (例如遍歷整個資料夾下有哪些檔案或資料夾),請自行google,因為小莫自己也還沒打算研究透徹XD

但也別失望~

以下提供小莫之前研究的結果,目前當作小工具給自己使用,這份程式碼的功能是「遞迴刪除所在資料夾內所有副檔名為『.exe』(應用程式) 的檔案」,所以請謹慎小心地使用 (或研究):

#undef UNICODE
#include<windows.h>
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int CNT=0;
int GetAllgpxFilepathFromfolder(char* Path)
{
    char szFind[MAX_PATH];
    WIN32_FIND_DATA FindFileData;
    strcpy(szFind,Path);
    strcat(szFind,"\\*.*");
    HANDLE hFind=FindFirstFile(szFind,&FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)return -1;
    do
    {
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if(strcmp(FindFileData.cFileName,".")!=0 && strcmp(FindFileData.cFileName, "..")!=0)
            {
                char szFile[MAX_PATH] = {0};
                strcpy(szFile,Path);
                strcat(szFile,"\\");
                strcat(szFile,FindFileData.cFileName);
                GetAllgpxFilepathFromfolder(szFile);
            }
        }
        else
        {
            string name=FindFileData.cFileName;
            if(name.size()<4||name.substr(name.size()-4)!=string(".exe"))continue;
            printf("%d: ",++CNT);
            name=string(Path)+"\\"+name;
            remove(name.c_str());
            printf("%s\n",name.c_str());
        }
    }while(FindNextFile(hFind,&FindFileData));
    FindClose(hFind);
    return 0;
}
int main()
{
    GetAllgpxFilepathFromfolder(new char[2]{'.','\0'});
    system("pause");
    return 0;
}


下一頁

感謝:
(版權所有 All copyright reserved)

沒有留言:

張貼留言

歡迎留言或問問題~
若您的留言中包含程式碼,請參考這篇
如果留言不見了請別慌,那是因為被google誤判成垃圾留言,小莫會盡快將其手動還原

注意:只有此網誌的成員可以留言。