Я не могу получить данные из txt-файла

    #include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define N 10
#define PI 3.14159265359

int i,j;

double const X0=5,Y0=5,FI=0.7854;//FI in rads
double fi=FI*180/PI;//fi in degress

struct exp_point{
    double x,y;
    double x1,y1;
    int line;
};


int main(){
    double d,x,y,x1,y1;
    i=0,j=0;
    FILE *fp;
    
    if ((fp=fopen("points2D_uni.txt","r"))==NULL)
{ printf("error reading file....\n");
exit(1);
}
else{
    while(!feof(fp)){
        fscanf(fp,"%lf  %lf",&x,&y);
        printf("x=%lf   y=%lf\n",x,y);
        x1=(x-X0)*cos(fi)+(y-Y0)*sin(fi);
        y1=(y-Y0)*cos(fi)+(x-X0)*sin(fi);
        d=pow(pow(x1-X0,2)+pow(y1-Y0,2),0.5);
        if (d>10.0)
            i++;
        else j++;
    }
fclose(fp);
    printf("i=%d   j=%d\n",i,j);
    
    struct exp_point *lim;
    struct exp_point *arr;
    
    lim=(struct exp_point *)calloc(i,sizeof(exp_point));
    arr=(struct exp_point *)calloc(j,sizeof(exp_point));
    printf("%d",i+j);
}
    
    
    return 0;   
}

Мне нужно получить некоторые данные из txt-файла, содержащего точки в системе координат, но когда я печатаю, все они равны 0, и сканирование файла никогда не заканчивается. Я пробовал как файл Unicode, так и с вкладками. В файле с табами ему присваивается первое число без десятичных точек, после чего все остальные данные отображаются как 0,0000.

Можете ли вы предоставить пример входного файла?

Scott Hunter 22.05.2024 14:06

давай я попробую загрузить это

George 22.05.2024 14:09

Пожалуйста, посмотрите Почему while ( !feof (file)) всегда неправильно? Это не то, что делает feof(), вы можете управлять циклом с помощью возвращаемого значения из fscanf() (в любом случае его следует проверить).

Weather Vane 22.05.2024 14:09

первое число — 8,555253262, а второе — 24,37160676, но печатается только 8,000000 и y=0,00000.

George 22.05.2024 14:10

Может быть, fscanf ожидает . вместо , в ваших числах?

Scott Hunter 22.05.2024 14:12

@Джордж, твой код не учитывает локаль. 8,55... использует немецкую десятичную запятую. В вашем коде предполагается локаль по умолчанию и десятичная точка. Вот почему fscanf находит запятую в качестве первого недопустимого символа, прекращает анализ числа и сохраняет 8 в вашем x. Поскольку последующая строка не соответствует вашему шаблону (поскольку она начинается с запятой), следующее значение будет равно нулю (в y). Кроме того, я думаю, что ваши координаты в вашем файле разделены разрывами строк, но вы не читаете их в своем цикле.

UniversE 22.05.2024 14:14

Я заменил все на . и еще есть проблема

George 22.05.2024 14:26

«Я заменил все , на . и проблема все еще остается». Какой вопрос? Вероятно, ваш файл имеет формат UNICODE. Какая у вас платформа?

Jabberwocky 22.05.2024 14:35

Да, мой файл в формате UNICODE, и я использую devC++.

George 22.05.2024 14:40

@Джордж, какая платформа? Windows/Linux/... ? И да, ваш файл не должен быть в формате UNICODE. Преобразуйте его с помощью вашего любимого текстового редактора. Я не могу дать больше подсказок, так как не знаю, на какой платформе вы находитесь.

Jabberwocky 22.05.2024 14:42

У вас есть //fi in degress, но вы передаете его sin(fi) и cos(fi). Это должно быть sin(FI) и cos(FI)? В любом случае, если это постоянное значение, вы можете предварительно вычислить их вне цикла.

Weather Vane 22.05.2024 14:42

...и это выглядит как поворот координат на угол FI вокруг точки (5, 5). Если да, то знак одного из членов sin(FI) в выражении может быть неправильным.

Weather Vane 22.05.2024 14:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот небольшая поправка и предложение

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define PI 3.14159265359

// Definition of the struct exp_point
struct exp_point {
    double x, y;
    double x1, y1;
    int line;
};

int main() {
    double X0 = 5, Y0 = 5, FI = 0.7854; // FI in radians
    double fi = FI; // Using FI directly since it is already in radians
    int i = 0, j = 0;
    double d, x, y, x1, y1;
    FILE *fp;

    // Provide the absolute path to the file
    const char *file_path = "/ABSOLUTE/PATH/file.txt"; // Replace with your actual file path

    // Attempt to open the file
    if ((fp = fopen(file_path, "r")) == NULL) {
        perror("Error opening file");
        exit(EXIT_FAILURE);
    }

    // Reading the file until the end
    while (fscanf(fp, "%lf %lf", &x, &y) == 2) {
        printf("Read values: x = %lf, y = %lf\n", x, y);
        
        // Applying transformation
        x1 = (x - X0) * cos(fi) + (y - Y0) * sin(fi);
        y1 = (y - Y0) * cos(fi) - (x - X0) * sin(fi);
        
        // Calculating distance using hypot
        d = hypot(x1 - X0, y1 - Y0);
        
        if (d > 10.0)
            i++;
        else
            j++;
    }

    // Close the file
    fclose(fp);

    printf("i = %d, j = %d\n", i, j);

    // Allocate memory for exp_point structures
    struct exp_point *lim = (struct exp_point *)calloc(i, sizeof(struct exp_point));
    struct exp_point *arr = (struct exp_point *)calloc(j, sizeof(struct exp_point));
    
    if (lim == NULL || arr == NULL) {
        perror("Error allocating memory");
        exit(EXIT_FAILURE);
    }

    printf("Total points processed: %d\n", i + j);

    // Free allocated memory
    free(lim);
    free(arr);

    return 0;
}

Получить абсолютный путь

#include <unistd.h>
#include <limits.h>
#include <stdio.h>

int main() {
    char cwd[PATH_MAX];
    if (getcwd(cwd, sizeof(cwd)) != NULL) {
        printf("Current working directory: %s\n", cwd);
    } else {
        perror("getcwd() error");
        return 1;
    }

    // The rest of your code...
}

Другие вопросы по теме