Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.77
warloc69
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
#1

Чтение данных из файла - C++

28.10.2011, 22:43. Просмотров 5402. Ответов 16
Метки нет (Все метки)

в общем у меня есть файл. в нем с начала идет строка указывающая путь к некому файлу. потом разношерстные циферки,
каким образом мне можно прочитать эту строку из файла в переменную. пробовал вот както так :
C++
1
2
3
4
FILE * f;
char * path;  
fopen_s(f,"file.txt","r");
fscanf_s(f,"%s",path);
вот только переменную path нужно перед этим инициализировать например так
C++
1
path = new char[100];
но каким размером его инициализировать не известно. Возьмом маленькое число элементов и получим переполнение в масиве, возьмом большое и получим занятую лишнюю память.
у кого есть какие идеи???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 22:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чтение данных из файла (C++):

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include<iostream> #include<fstream> #include<locale.h> #include<iomanip>...

Чтение из файла определённого места и сортировка данных исходя из этих данных
Есть некий текстовый документ, содержащий информацию о посещении сайта в...

Чтение данных из файла С++
Здравствуйте. Дан простой пример потокового ввода/вывода дисковых файлов из...

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

Чтение данных из файла
Вот задание прочитать данные из файла и вывести их также как они в файле...

Чтение данных из файла
Здравствуйте, в программе нужно прочитать данные из файла и записать результат...

16
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
28.10.2011, 23:08 #2
если тебе жалко память но плевать на быстродействие используй
fgetc
reealoc

читаешь файл пока не встретишь цифру и вместе с этим изменяешь границу памяти
0
warloc69
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
28.10.2011, 23:35  [ТС] #3
Цитата Сообщение от Van111 Посмотреть сообщение
если тебе жалко память но плевать на быстродействие используй
fgetc
reealoc

читаешь файл пока не встретишь цифру и вместе с этим изменяешь границу памяти
по символьно файл можно читать и через fscanf_s(f,"%c",simvol);
насколько я понял для использования reealoc нужно память выделять malloc а это устаревшый метод С, я выделяю память через new, и сомневаюсь что reealoc будет правельно работать в этом случае. есть ещё идеи?
0
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
28.10.2011, 23:39 #4
Цитата Сообщение от warloc69 Посмотреть сообщение
я выделяю память через new
найди эквивалент
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
29.10.2011, 14:44 #5
Цитата Сообщение от warloc69
пробовал вот както так :
а ты знаешь, что функций fopen_s() и fscanf_s() в языке нет ?

Цитата Сообщение от warloc69
вот только переменную path нужно перед этим инициализировать например так
если это очень важно, то можно сначала прочитать эту строку посимвольно, узнав таким образом количество символов, а потом выделить malloc(n + 1)
но у тебя C++, поэтому используй просто string, а для открытия файла - fstream
0
YouDoItWrong
47 / 47 / 24
Регистрация: 29.10.2011
Сообщений: 154
29.10.2011, 15:44 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <fstream>
#include <iostream>
#include <string>
 
using namespace std;
 
int main() {
    string file_name, string_from_file;
 
    ifstream input_file("filename.txt");
    getline(input_file,file_name);
    input_file.close();
    input_file.open(file_name);
    //Тут дальнейшие действия.. к примеру вывести строку из файла;
    getline(input_file,string_from_file);
    cout << string_from_file << endl;
    input_file.close();
    system("pause");
}
Этот код считывает строку из файла A с путем к файлу В, берет из файла строку и выводит на экран. Пишите если нужно будет каким-либо образом изменить код
0
warloc69
78 / 78 / 9
Регистрация: 28.10.2011
Сообщений: 219
29.10.2011, 22:04  [ТС] #7
Цитата Сообщение от accept Посмотреть сообщение
а ты знаешь, что функций fopen_s() и fscanf_s() в языке нет ?
а это что тогда? http://msdn.microsoft.com/en-us/library/z5hh6ee9%28v=vs.80%29.aspx

Добавлено через 2 минуты
YouDoItWrong а если в файле элементы (путь, цыферки) розделены не на строки а скажем пробелами? что то мне кажется что это вариант не прокатит.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
30.10.2011, 08:22 #8
Цитата Сообщение от warloc69
а это что тогда?
это расширение компилятора
такая программа будет собираться только на этом компиляторе
1
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
30.10.2011, 10:01 #9
accept, а maloc и new не различаются
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
30.10.2011, 10:03 #10
Цитата Сообщение от Van111 Посмотреть сообщение
accept, а maloc и new не различаются
Различаются немного, тем более что у ТСа код на С, в котором new нету.
0
mimicria
return (true);
1960 / 1097 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
30.10.2011, 10:13 #11
Если надо целиком файл загнать в массив char в чём проблема узнать его размер fseek/ftell ?
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
31.10.2011, 03:03 #12
Цитата Сообщение от mimicria
в чём проблема узнать его размер fseek/ftell ?
в си через fseek() + ftell() нельзя узнавать размер файла

C89(draft). fseek
A binary stream need not meaningfully support fseek calls with a whence value
of SEEK_END.
для текстового потока размер просто не узнаешь таким образом
для двоичного потока не установишь индикатор файловой позиции в конец
а если доходить по символу, то и ftell() не нужна, так как можно просто считать символы

Добавлено через 6 минут
Цитата Сообщение от Van111
accept, а maloc и new не различаются
если для C++, то нужно использовать new, а не malloc()
это если там вообще нужно выделение памяти
0
YouDoItWrong
47 / 47 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 07:48 #13
Код:
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 <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int main() {
        string file_name, string_from_file,str;
        vector<string> file_b;
 
        ifstream input_file("filename.txt");
        input_file >> file_name;
        input_file.close();
        input_file.open(file_name);
        //Тут дальнейшие действия.. к примеру вывести строку из файла;
        while(!input_file.eof()) {
            input_file >> str;
            file_b.push_back(str);
            cout << str << endl;
        }
        input_file.close();
        system("pause");
}
Файл "filename.txt":
C++
1
2
3
4
5
C:\\Python27\\pytonscript.py // /WEQ QWER Q1 1451 15
141 1235 141 562    25 52 252 
2312 1 5 1  36 AF 2 R1 ** AD ?? <>< QWE 1512 412413 124W 
QWE QWE 
 141 1 5R14 1251 4 62 356 23 3523 1 63242 3 2  2     2 2421 1 21
Файл "pytonscript.py":
Python
1
2
3
4
5
def getClass():
    return dict
class D(getClass()):
    pass
d = D()
Консоль:
0
Миниатюры
Чтение данных из файла  
YouDoItWrong
47 / 47 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 07:51 #14
В векторе file_b храниться все из файла "pytonscript.py", дальше с этим вектором можно делать все что угодно Такой код вам нужен?
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
31.10.2011, 07:53 #15
Цитата Сообщение от YouDoItWrong
C++
1
while(!input_file.eof()) {
обязательно проверять на ошибку чтения, иначе может повиснуть цикл
0
YouDoItWrong
47 / 47 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 08:00 #16
C++
1
2
3
4
5
6
7
8
9
10
while(!input_file.eof()) {
            if(input_file.bad() || input_file.fail()) {
                cout << "Error";
                input_file.close();
                return 0;
            }
            input_file >> str;
            file_b.push_back(str);
            cout << str << endl;
        }
Как то так?

Добавлено через 36 секунд
И что блин с форматированием кода >_<
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
31.10.2011, 08:25 #17
ну не в if условии, а прямо в while
может даже не .bad() ни .fail(), а сразу !input_file.good() (или is_good там, не помню)

лучше так (короче):
C++
1
2
    while(input_file >> str)
        ;
0
31.10.2011, 08:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2011, 08:25
Привет! Вот еще темы с решениями:

Чтение данных из файла
Очень нужна помощь: никак не получается написать функцию чтения из файла на...

Чтение данных из файла
здравствуйте. суть проблемы: у меня есть некий файл, в котором записаны в 2...

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

Чтение данных из файла
Доброго времени, долго искал ответ, решил все таки спросить. Есть файл в...


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

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

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