簡體   English   中英

程序不想讀取文件

[英]Program doesnt want to read file

這是我的結構

   typedef struct {
        char mmsi[10];
        char name[20];
        double latitude;
        double longitude;
        int course;
        double speed;
    }Vessel;

這是我的功能,不想工作

void searchByLatLong(double latitude, double longitude){
        FILE * file;
        struct dirent *drnt;
        DIR * dir = opendir("./text");
        char *path = (char *)malloc(19);
        Vessel *vessel = (Vessel *)malloc(sizeof(Vessel));

        while((drnt = readdir(dir)) != NULL) {
            if(strcmp(drnt->d_name,".") && strcmp(drnt->d_name,"..")) {

                strcpy(path,"text/");
                strcat(path,drnt->d_name);

                file=fopen(path, "r");
                fscanf(file," %s %[a-zA-Z0-9 ]19s %lf %lf %d %lf", &vessel->mmsi,&vessel->name,&vessel->latitude,&vessel->longitude,&vessel->course,&vessel->speed);

        //  if (mmsi+".txt" == drnt->d_name){
                    printf("%s\n%s\n%lf\n%lf\n%d\n%lf\n\n",vessel->mmsi,vessel->name,vessel->latitude,vessel->longitude,vessel->course,vessel->speed);
            //}


            fclose(file);
        }
        seekdir(dir, telldir(dir)); 

    //  if(this->mmsi == mmsi){
        //  printVessel();
    //  }

    }
    closedir(dir);
}

當我嘗試加載txt文件時,它只加載兩個第一個字符串,然后它從內存中加入一些垃圾。 將數據加載到另一個變量不會改變任何內容; /這是一個應加載的示例txt文件:

3
RMS Titanic
22.222
33.333
4
5.9

問題出在你的格式字符串上。 正確的格式字符串是:

" %s %19[a-zA-Z0-9 ] %lf %lf %d %lf"

字段寬度在轉換說明符之前。 此外,[...]序列是一個轉換說明符,就像's'一樣。 你看到的問題是fscanf()處理'3'因為它匹配第一個%s 然后它處理'RMS泰坦尼克號',因為它匹配%[a-zA-Z0-9 ]但隨后處理停止,因為輸入中沒有'19s'。 此時剩余的參數未初始化。

你應該檢查fscanf()的返回值。 它會告訴您實際執行了多少次轉換。

感謝您發布一個有趣的問題; 我了解了fscanf()和它接受的[]符號。

[]表示法指定正在讀取字符串,因此,您附加到它的s被視為應該匹配的文字字符。 同樣,您提供的寬度說明符19應出現在[]之前。

如果您有一艘名為“RMS Titanic19s”的船,您當前的代碼將開始工作。

將您的fscanf更改為:

fscanf(file," %s %19[a-zA-Z0-9 ] %lf %lf %d %lf",
    vessel->mmsi,vessel->name,&vessel->latitude,
    &vessel->longitude,&vessel->course,&vessel->speed);

並且您的代碼將開始工作。

注意我通過從char []成員mmsiname刪除多余的&修復了一些編譯警告 - 這些已經指向你想要填充的緩沖區。 你不需要&在他們面前。 教學的替代形式是&vessel->mmsi[0] - mmsi的第一個字符的mmsi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM