1 / 1 / 1
Регистрация: 20.02.2013
Сообщений: 20
1

Считывание с файла в массив

02.04.2013, 14:43. Показов 1760. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Задача казалось бы очень тривиальная, но нагуглить готовый вариант не смог.
Есть обычный *.txt файл. В нем записаны числа, через пробел(запятую), в несколько строк. Заполнить массив этими числами. Проблема то в том количество чисел, строк может быть разным.
Даже с одной строкой ничего не получается.
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
#include <stdio.h>
int main()
{
int size = 0, numb;
FILE *in;
if ((in=fopen("num_arr.txt","r")) ==NULL)
  {
   printf("Error with open file\n");
   return;
  }
while (!feof(in)) // считаем количество символов
{
fscanf(in,"%d",&numb);
size++;
}
unsigned int buf[size]; // объявляем массив 
for (int i = 0; i < size; i++) //заполняем
{
fscanf(in,"%d",&numb);
buf[i] = numb; // и вот тут происходит страшное 
}
fclose(in);
return;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2013, 14:43
Ответы с готовыми решениями:

Считывание в массив с файла
Есть файл, в котором записаны цифры, например: &quot;10 15 16 17 1 -4 -6 78 -1 7 18 15&quot;. Мне надо...

Считывание данных с файла в массив
Считываю данные с файла в массив но все индексы массива принимают последнее значение строки....

Считывание чисел с файла в массив
Всем привет. Не могу разобраться, как правильно мне считать N числа с моего файла file.txt и...

Считывание файла в массив строк
Добрый день, подскажите пожалуйста, где ошибка: есть файл в котором строки 123 флоалф 124...

7
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
02.04.2013, 16:36 2
Цитата Сообщение от lllypyn Посмотреть сообщение
// и вот тут происходит страшное
нет страшное происходит на одну сторку выше, ты в конце файла, алёша

Цитата Сообщение от lllypyn Посмотреть сообщение
unsigned int buf[size]; // объявляем массив
переполнение стека
0
1 / 1 / 1
Регистрация: 20.02.2013
Сообщений: 20
02.04.2013, 19:15  [ТС] 3
Цитата Сообщение от _1_ Посмотреть сообщение
переполнение стека
Мне паниковать, или ещё можно что-то сделать?
И как снова перейти в начало файла?
0
Qu
2 / 2 / 2
Регистрация: 02.04.2013
Сообщений: 10
02.04.2013, 22:54 4
Цитата Сообщение от lllypyn Посмотреть сообщение
И как снова перейти в начало файла?
функция rewind(in) или fseek(in, 0L, SEEK_SET), хотя по-хорошему нужно в один проход по файлу всё сделать, создавая динамический массив
0
1 / 1 / 1
Регистрация: 20.02.2013
Сообщений: 20
03.04.2013, 00:16  [ТС] 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *mas, n, i;
FILE *in;
if ((in=fopen("text.txt","r")) ==NULL)
  {
   printf("Error with open file\n");
   return;
  }
while (!feof(in))
{
fscanf(in,"%d",&n);
mas = malloc(n*sizeof(int));;
}
 
for (i = 0; i < n; i++) printf("%d",mas[i]);
printf("\n");
free(mas);
fclose(in);
return;
}
А сейчас что не так?
0
Qu
2 / 2 / 2
Регистрация: 02.04.2013
Сообщений: 10
03.04.2013, 11:18 6
Имелось ввиду нечто подобное:

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
#include <stdio.h>
#include <stdlib.h>
int main()
{
    const int step=10; // чтобы не каждый шаг перевыделять память
    int *mas, i=0, n=step; // i - текущий индекс, n - длина массива
    FILE *in;
    if ((in=fopen("text.txt","r")) ==NULL)
    {
        printf("Error with open file\n");
        return 1;
    }
    mas=malloc(n*sizeof(int));
    while (!feof(in))
    {
        if (fscanf(in,"%d", mas+i)!= EOF)
        {
            i++;
            if (i>=n)
            {
                n+=step;
                mas=realloc(mas, n*sizeof(int)); //перевыделяем память
            }
            fscanf(in, ","); // чтобы проглотить запятую, если она есть
        }
    }
    n=i;
    mas=realloc(mas, n*sizeof(int));
    for (i = 0; i < n; i++) printf("%d ",mas[i]);
    printf("\n");
    free(mas);
    fclose(in);
    return 0;
}
1
1 / 1 / 1
Регистрация: 20.02.2013
Сообщений: 20
03.04.2013, 14:29  [ТС] 7
Спасибо большое то, что нужно.
Цитата Сообщение от Qu Посмотреть сообщение
fscanf(in, ","); // чтобы проглотить запятую, если она есть
Вот по этому пункту есть вопрос, таким методом получается можно глотать любые знаки?
Ну и ещё по кодировке вопрос. Есть ли разница в какой кодировке отправлять программе текст? Т.е. получится для поиска, допустим файл сохранён в юникоде, я могу использовать такое "\u002C"?
0
Qu
2 / 2 / 2
Регистрация: 02.04.2013
Сообщений: 10
03.04.2013, 17:16 8
Цитата Сообщение от lllypyn Посмотреть сообщение
Вот по этому пункту есть вопрос, таким методом получается можно глотать любые знаки?
Фактически, тут мы указываем, что ожидаем далее встретить в файле ",". Можно записать в строку формата любые ожидаемые символы кроме % (если ожидается символ % в строке формата необходимо написать %%) и символов-разделителей (Под символами-разделителями понимаются символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и смены страницы.) Символы пробела и табуляции просто игнорируются.
Кликните здесь для просмотра всего текста
Информация из "The C Programming Language" Брайан Керниган (Brian W. Kernighan), Деннис Ритчи (Dennis M. Ritchie) про функцию fscanf().

Про кодировку ничего сказать не могу.
0
03.04.2013, 17:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2013, 17:16
Помогаю со студенческими работами здесь

Считывание данных из файла в массив
Требуется считать данные из файла в массив и лучше бы если блоками или даже целиком. Использую...

Считывание данных с файла в динамический массив
Надо написать программу для считывания двумерного массива из файла, при этом память под массив...

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

Посимвольное считывание с файла и запись в массив
Всем привет, подскажите, правильно ли я выполняю посимвольное(Нужно считывать, не зная заранее...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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