Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 10.10.2019
Сообщений: 11
1

Построчное считывание файла и преобразование считанной строки в число (linux)

11.12.2019, 18:56. Показов 1849. Ответов 6

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста, нужно последовательно преобразовывать строки файла в числа (желательно unsigned short) и записывать в массив. Ниже мой текущий нерабочий код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 FILE * lMap;
 if ((lMap = fopen(fileName, "r")) == NULL) puts ("\e[1;1H\e[2K This file is not exist!"); else
 {
    lMap  = fopen(fileName, "r");
    fgets (nStr, sizeof (nStr), lMap); n = atoi(nStr); // преобразование в целое число здесь работает корректно
  
    for (unsigned short i = 0; i < n; i++)
    {
        if (i < n/2) { fgets (xStr, 3, lMap); itemX[i] = atoi(xStr); } else // здесь и ниже строки преобразуются в 0,
        if (i < n) { fgets (yStr, 3, lMap); itemY[i] = atoi(yStr); }          // хотя в файле указаны иные числа
 
    }
    fclose(lMap);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2019, 18:56
Ответы с готовыми решениями:

Построчное считывание с файла до конца строки
Можно ли применить в цикле такую конструкцию: while(!\n){} , чтобы прога считывала только до конца...

Считывание строки из файла, ее преобразование в функцию
Ребят помогите, очень нужно считать строку с примерным текстом ( f(x)=54+14*x^2-x ) Разбить ее на...

Построчное считывание из файла
Сразу к сути вопроса - мне надо считать текст из файла(целиком), но текст может быть слишком...

Построчное считывание файла
В файле у меня все строки вида: \x53\x74\x69\x6C\x6C\x2E\x2E\x2E\x00 Код считывающий файл...

6
Мозгоправ
1744 / 1038 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
11.12.2019, 22:54 2
Sid_Pic, строка 4 лишняя.

Покажите содержимое файла из которого читаются данные.
1
1 / 1 / 0
Регистрация: 10.10.2019
Сообщений: 11
12.12.2019, 19:21  [ТС] 3
Почему четвёртая - лишняя?
часть файла:
....
78
77
76
75
74
73
23
23
....
0
4240 / 2937 / 687
Регистрация: 08.06.2007
Сообщений: 9,817
Записей в блоге: 4
12.12.2019, 20:26 4
Почему такой маленький буфер для чтения чисел? Если я правильно понимаю, после первого чтения буфер будет содержать символы '7','8','\0', типа всё правильно. Второе чтение даст '\n','\0','\0'. Следующее чтение даст '7','7','\0'. Наверно, вы не этого хотели?

Добавлено через 11 минут
Цитата Сообщение от Sid_Pic Посмотреть сообщение
Почему четвёртая - лишняя?
Вы уже открыли файл. Какой смысл открывать его повторно в том же режиме?
1
Мозгоправ
1744 / 1038 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
12.12.2019, 21:54 5
Лучший ответ Сообщение было отмечено Sid_Pic как решение

Решение

Sid_Pic, видимо вам нужно что-то типа такого:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define BUFLEN 80
 
int main(void)
{
    const char* fileName = "input.txt";
    char nStr[BUFLEN];
    int n;
    int itemX[100], itemY[100];
 
    FILE* lMap;
    if ((lMap = fopen(fileName, "r")) == NULL)
        puts("\e[1;1H\e[2K This file is not exist!");
    else
    {
        fgets(nStr, sizeof(nStr), lMap);
        n = atoi(nStr);
 
        for (unsigned short i = 0; i < n; ++i)
        {
            fgets(nStr, BUFLEN, lMap);
            if (i < n / 2)
                itemX[i] = atoi(nStr);
            else
                itemY[i - n / 2] = atoi(nStr);
 
        }
        fclose(lMap);
 
        for (unsigned short i = 0; i < n / 2; i++)
            printf("[%d, %d]\n", itemX[i], itemY[i]);
    }
 
    return 0;
}
Добавлено через 3 минуты
Я не очень понял, зачем вы читаете построчно, а потом переводите в целое.
Видимо, в это есть какой-то свой сакральный смысл?
На мой взгляд было бы проще пользоваться fscanf().
1
1 / 1 / 0
Регистрация: 10.10.2019
Сообщений: 11
13.12.2019, 19:52  [ТС] 6
Цитата Сообщение от L0M Посмотреть сообщение
Я не очень понял, зачем вы читаете построчно, а потом переводите в целое.
Видимо, в это есть какой-то свой сакральный смысл?
Чтобы переменные не сливались, очевидно же, перевожу в целое чтобы пользоваться можно было.
Цитата Сообщение от L0M Посмотреть сообщение
На мой взгляд было бы проще пользоваться fscanf().
fscanf(lMap, "%s", value) почему-то вообще (null) записывает.
Цитата Сообщение от L0M Посмотреть сообщение
видимо вам нужно что-то типа такого
Ваш способ делает всё-таки делает то же самое, хоть и более правильно.

Добавлено через 34 минуты
Всем спасибо. Невероятно, но факт: при разделении циклов всё заработало
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    FILE * lMap;
    if ((lMap = fopen(fileName, "r")) == NULL) puts ("\e[1;1H\e[2K This file is not exist!"); else
    {
      puts ("\e[2J");
       fgets (nStr, sizeof(nStr), lMap); n = atoi(nStr);
 
         for (unsigned short i = 0; i < n; i++)
        {
           fgets (nStr, 4, lMap);
           itemX[i] = atoi(nStr);
        }
  
        for (unsigned short i = 0; i < n; i++)
        {
           fgets (nStr, 4, lMap);
           itemY[i] = atoi(nStr);
        }
    }
         fclose (lMap);
0
Мозгоправ
1744 / 1038 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
13.12.2019, 20:02 7
Sid_Pic, вот же:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int main(void)
{
    const char* fileName = "input.txt";
    int n;
    int itemX[100], itemY[100];
 
    FILE* lMap;
    if ((lMap = fopen(fileName, "r")) == NULL)
        puts("\e[1;1H\e[2K This file is not exist!");
    else
    {
        fscanf(lMap, "%d", &n);
 
        for (unsigned short i = 0; i < n; ++i)
        {
            if (i < n / 2)
                fscanf(lMap, "%d", &itemX[i]);
            else
                fscanf(lMap, "%d", &itemY[i - n / 2]);
        }
        fclose(lMap);
 
        for (unsigned short i = 0; i < n / 2; i++)
            printf("[%d, %d]\n", itemX[i], itemY[i]);
    }
 
    return 0;
}
Не?

Добавлено через 5 минут
Цитата Сообщение от Sid_Pic Посмотреть сообщение
Ваш способ делает всё-таки делает то же самое, хоть и более правильно.
А что делает "то же самое", но "более правильно"? Не работает, как и у вас?

Добавлено через 3 минуты
Интересно. То, что вы дописали в посте #6, несколько отличается по количеству считываемых данных от стартового топика. В #1 вы считывали n данных в два массива. В #6 вы считываете 2n данных в те же два массива.
0
13.12.2019, 20:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2019, 20:02
Помогаю со студенческими работами здесь

Построчное считывание файла
Всё, я совсем запуталась. Помогите пожалуйста!!! Есть файл, который нужно считать. Но...

Построчное считывание из файла
есть txt файл с тестом, в тесте есть вопросы и ответы! надо чтобы вопросы вместе с ответами...

Построчное считывание из файла
Как считать ПОСТРОЧНО элементы матрицы из файла в Delphi 7??? =О Подскажите позязя =3 ...

Построчное считывание файла
поделитесь готовой функцией или способом, с помощью которого можно считать с текстового файла...

Построчное считывание из файла
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;malloc.h&gt; typedef struct { double x1; ...

Построчное считывание из файла
Всем привет! Функция, которая считывает из файла значения и помещает их в массив. Проблема в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru