Программа не хочет читать файл - PullRequest
3 голосов
/ 25 марта 2012

это моя структура

   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);
}

Когда я пытаюсь загрузить текстовый файл, он загружает только две первые строки, затем после негоесть немного мусора из памяти.Загрузка данных в другие переменные ничего не меняет; / Это типовой текстовый файл, который должен быть загружен:

3
RMS Titanic
22.222
33.333
4
5.9

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Проблема с вашей строкой формата. Правильная строка формата:

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

Ширина поля идет перед спецификатором преобразования. Кроме того, последовательность [...] является спецификатором преобразования, как и 's'. Проблема, которую вы видите, состоит в том, что fscanf() обрабатывает '3', потому что он соответствует первому %s. Затем он обрабатывает «RMS Titanic», потому что он соответствует %[a-zA-Z0-9 ], но затем обработка останавливается, потому что на входе нет «19». На этом этапе остальные аргументы неинициализированы.

Вы должны проверить возвращаемое значение с fscanf(). Он скажет вам, сколько преобразований было фактически выполнено.

0 голосов
/ 25 марта 2012

Спасибо за размещение интересного вопроса;Я узнал о 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 [] членов mmsi и name - они уже указывают на буферы, которые вы хотите заполнить.Вам не нужно & перед ними.Педагогическая альтернативная форма - &vessel->mmsi[0] - адрес первого символа mmsi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...