Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
p1at0n
1 / 1 / 2
Регистрация: 14.12.2012
Сообщений: 14
#1

Как перевести файл в строку - C (СИ)

15.12.2012, 23:55. Просмотров 921. Ответов 15
Метки нет (Все метки)

Задача: выделить динамически память под строку из файла.

я узнаю количество символов в файле через
C
1
2
3
4
5
while(!feof(input))
{
getc(input);
text_length++;
}
Потом выделяю память под строку:
http://www.cyberforum.ru/c-beginners/thread561983.html
C
1
text=(char*)malloc(text_length);
Дальше мне нужно перевести файл в массив text, но вызов getc() скорее всего выдаст EOF.
Вопрос: как перевести (курсор или что там) на первый символ, чтобы можно было считать строку?
Ну или подскажите другой подход)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 23:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как перевести файл в строку (C (СИ)):

Как перевести строку-арифметическое выражение в обратную польску запись
Имеется объявление массива символов char Str; я записал туда все символы...

Файл: Считать строки в два разных масcива, первую строку вывести в консоль, вторую строку - в файл
Итак, имеется два файл in.txt, out.txt. В файле in 2 строки: В первой строке...

Как записать посимвольно в файл строку?
Не могу понять как записать посимвольно в файл строку, выдает ошибки,...

Числа в массиве перевести в строку
Дан массив чисел (1,0,1,1,0,1,0,1) из него надо получить строку. Смысл всей...

Как перейти на первую строку для записи следующего массива в файл?
Я считаю в цикле значения массива, как после расчета очередного массива аа...

15
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.12.2012, 00:07 #2
man getline
1
p1at0n
1 / 1 / 2
Регистрация: 14.12.2012
Сообщений: 14
16.12.2012, 00:28  [ТС] #3
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 <malloc.h>
int main()
{
 
FILE *input, *output;
unsigned int i=0, key_length=0, text_length=0;
char *text;
 
input=fopen("input.txt", "r");
output=fopen("output.txt", "w+");
 
 
while(!feof(input))
{
getc(input);
text_length++;
}
 
text_length -= 2;  //Исключаем ЕОF
printf("Dlina: %d\n", text_length);
 
text=(unsigned char*)malloc(text_length);
 
getline(&text, &text_length, input);
 
for(i=0;i<text_length;i++)
printf("%c ", text[i]);
 
fclose(input);
fclose(output);
return 0;
 
}

Вот код, при выводе text программа выводит пробелы, хотя в файле input четыре единицы.
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.12.2012, 01:02 #4
Функция getlien(), уже считывает с открытого потока строку, поэтому открывать дополнительно поток не нужно. Ко всему прочему желателно проверять на ошибку отркытия файла (NULL в случаи ошибки)
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
#include <stdio.h>
#include <stdlib.h>
int main()
{
 
    FILE *input, *output;
    unsigned int i=0, key_length=0, text_length=0;
    char *text = NULL; // желательно обезопасить указатель
    
    if ((input=fopen("input.txt", "r")) == NULL)
    return -1;
    if ((output=fopen("output.txt", "w+")) == NULL)
    return -1;
    
    while(!feof(input))
    {
        getc(input);
        text_length++;
    }
    
    rewind(input); // Установить указатель на начало файла
    //text_length -= 2;  //Исключаем ЕОF
    //printf("Dlina: %d\n", text_length);
    
    getline(&text, &text_length, input); // прочитать первую строку
    
    printf(text);
    
    free(text); // освободить память выделенную под *text функцией getline()
    fclose(input);
    fclose(output);
    return 0;
}
Добавлено через 3 минуты
Ну и после записи в файл у тебя потока input указывает на конец(там где закончился поток), поэтому чтобы считать занесённую в файл информацию нужно поток переставить на начало функцией rewind()

Добавлено через 2 минуты
Цитата Сообщение от xtorne21st Посмотреть сообщение
while(!feof(input)) { getc(input); text_length++; }
Не заметил, что не ложешь в поток а считываешь. Это можно вообще убрать...
1
p1at0n
1 / 1 / 2
Регистрация: 14.12.2012
Сообщений: 14
16.12.2012, 01:13  [ТС] #5
Спасибо, все работает. Буду дальше разбираться.

Добавлено через 4 минуты
Цитата Сообщение от xtorne21st Посмотреть сообщение
Сообщение от xtorne21st
while(!feof(input)) { getc(input); text_length++; }
Не заметил, что не ложешь в поток а считываешь. Это можно вообще убрать...
А как тогда узнать длину строки для выделения памяти?
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.12.2012, 01:19 #6
для выделения памяти под что? Любой массив рассчитывается по формуле size = sizeof(arr) / sizeof(*arr);
Грубо говоря: весь массив (в байтах) разделить на один его элемент. Результат тоже будет в байтах.

Добавлено через 1 минуту
в твоём случаи узанать длину строки можно:
C
1
size = sizeof(text) / sizeof(char)
Добавлено через 39 секунд
и получишь количество символов text
1
p1at0n
1 / 1 / 2
Регистрация: 14.12.2012
Сообщений: 14
16.12.2012, 01:22  [ТС] #7
Но мне же text_length нужно знать до вызова getline, ведь так?
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.12.2012, 01:28 #8
нет, фишка функции getline (если ты ещё раз внимательно прочитаешь ман) что она возвращает длину, т.е. сама функция считает количество символов в стоке и она сама же выделяет динамическое пространство необходимое для хранения символов. Тебе остается только после использования освободить выделенную память функцией free().
0
p1at0n
1 / 1 / 2
Регистрация: 14.12.2012
Сообщений: 14
16.12.2012, 01:43  [ТС] #9
При выводе на экран text_length выводит 120, независимо от длины строки в input.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
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
int main()
{
 
    FILE *input, *output;
    unsigned int i=0, text_length=0;
    char *text = NULL;
    
    if ((input=fopen("input.txt", "r")) == NULL)
    return -1;
    if ((output=fopen("output.txt", "w+")) == NULL)
    return -1;
    
    getline(&text, &text_length, input); 
 
 
    
  //  rewind(input); // Установить указатель на начало файла
 
    printf("%d\n", text_length);
    
 
    fprintf(output, "%s", text);
    
 
    free(text); //освобождаем после getline
    fclose(input);
    fclose(output);
    return 0;
}
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.12.2012, 10:09 #10
Позволю себе заметить, что функция getline не является стандартной.
1
p1at0n
1 / 1 / 2
Регистрация: 14.12.2012
Сообщений: 14
16.12.2012, 12:25  [ТС] #11
Цитата Сообщение от fasked Посмотреть сообщение
Позволю себе заметить, что функция getline не является стандартной.
man getline:
Кликните здесь для просмотра всего текста
NAME
getline, getdelim - delimited string input

SYNOPSIS
#define _GNU_SOURCE
#include <stdio.h>

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);


stdio.h вроде стандартная библиотека, или я что-то путаю?
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.12.2012, 12:26 #12
Цитата Сообщение от p1at0n Посмотреть сообщение
stdio.h вроде стандартная библиотека, или я что-то путаю?
Во-первых, это не библиотека, а во-вторых в стандарте языка не упоминается про такую функцию. Т.е. getline это по сути расширение GNU.
0
p1at0n
1 / 1 / 2
Регистрация: 14.12.2012
Сообщений: 14
16.12.2012, 12:27  [ТС] #13
Окей, но почему она возвращает в text_length значение 120?
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.12.2012, 12:36 #14
Цитата Сообщение от p1at0n Посмотреть сообщение
При выводе на экран text_length выводит 120, независимо от длины строки в input.txt
Добавь ещё одну переменную типа ssize_t, например, как написано в мане c именем read:
C
1
read = getline(&text, &text_length, input);
и получишь количество символов. text_length - это величина в байтах для динамического массива (вроде так).
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
16.12.2012, 12:42 #15
Цитата Сообщение от p1at0n Посмотреть сообщение
Окей, но почему она возвращает в text_length значение 120?
Может, потому что она увеличила размер буфера до 120b?
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
16.12.2012, 16:36 #16
Цитата Сообщение от fasked Посмотреть сообщение
Позволю себе заметить, что функция getline не является стандартной.
А жаль...
0
16.12.2012, 16:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2012, 16:36
Привет! Вот еще темы с решениями:

Перевести одну строку c float в double
Подскажите. Есть код. Все задано через float. Но 10 VS не вытаскивает одну из...

Перевести строку в целое типа int
Нужно перевести строку например &quot;kklllluuuu&quot; в целое типа int как можно это...

Перевести файл в шестнадцатеричную последовательность
Возможно пишу не то, но постараюсь передать суть вопроса. Я сейчас занимаюсь...

Ввести строку в файл с клавиатуры
Задача звучит так: Сделать 3 записи в файл формата .txt(фамилия, имя,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru