Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Получить массив строк из файла


Автор: Redstuff 12.5.2007, 13:21
Получить массив строк из файла.
По поиску нашел несколько примеров, но чето не разбирусь в них.

 smile 

Автор: boriska 12.5.2007, 14:19
http://forum.vingrad.ru/forum/topic-139737/anchor-entry1055342/0.html смотрел, что именно не понятно???

Автор: Damarus 12.5.2007, 14:20
Код
#include <iostream>
#include <string>
#include <vector>
#include <fstream>

int main(int argc, char *argv[])
{
    std::ifstream input("test.txt");

    std::vector<std::string> array;

    std::copy(std::istream_iterator<std::string>(input), std::istream_iterator<std::string>(),
        std::back_inserter<std::vector<std::string> >(array));
}

Автор: Redstuff 13.5.2007, 13:26
boriska, Да смотрел... vector не понятен

В этом примере только кол-во строк.
Код

// и начерта мне этот cout ?
#include <iostream>
// файловые операции
#include <cstdio>
// строковые функции
#include <cstring>
using namespace std;

// массив символов
typedef char string831[81];

// 2 returna
string831 * add(string831 * array,int &N ,string831 ne)
{
  // создаем увеличенную копию динамического массива строк
  string831 * y = new string831[N+1];
   for(int i=0;i<N;i++)
   {
       strcpy(y[i] , array[i]);
   }
   if(N)
       delete [] array;
   strcpy(y[N],ne);
   // увеличиваем количество элементов
   N++;
  // возвращаем адрес в куче
   return y;
}

main()
{
    string831 * x=NULL,s; int N=0;
     // открываем файл для чтения
    FILE * f = fopen("Dynamic83.cpp","rt");
     // читаем строки
    while( fgets(s,80,f ) )
       // расширяем динамический массив
        x=add(x,N,s);
    fclose(f);
    // vivod masiva x
    cout<<N<<'\n';
    delete [] x;

}



Автор: boriska 13.5.2007, 15:44
Redstuff, а что vector, vector - контейнер из стандартной библиотеки, в сети 
много инфы на эту тему (на  rsdn.ru раздел STL например)
Почитай Н.Джосьютис "С++ Стандартная библиотека" или Леен Аммераль "STL для программистов на С++" в теме  литература, 
посмотришь где скачать можно.

А по поводу
Цитата

В этом примере только кол-во строк. 

Что не понятно ???  smile 
string831 *x указывает на твой массив строк
 

Автор: Redstuff 14.5.2007, 20:24
Переменная s типа char?
Код

 // читаем строки
    while( fgets(s,80,f ) )
       // расширяем динамический массив
        x=add(x,N,s);

Как тогда переменную s сравнить с др. строкой?

Например в файле:
Код

string1
string2
string3


Код

while( fgets(s,80,f ) ) {
       // расширяем динамический массив
                x=add(x,N,s);
    if(s=="string2")   // кстати учитываются спец. символы?
        cout << "строка " << N << " равна заданой строке" << endl;
    else cout<<"нет совпадений";
}

Автор: JackYF 14.5.2007, 20:52
Цитата(Redstuff @  14.5.2007,  20:24 Найти цитируемый пост)
s=="string2"

Код

strcmp(s,"string2")==0

Автор: Redstuff 15.5.2007, 00:02
JackYF, спасибо, это наверно самый простой способ )

все таки спец символы тоже надо учитывать )

Код

strcmp(s,"string2/n")==0



Код

while( fgets(s,80,f ) ) {
       // расширяем динамический массив
                x=add(x,N,s);
    if(strcmp(s,"string2/n")==0) 
        cout << "строка " << N << " равна заданой строке" << endl;
    else cout<<"нет совпадений";
}
// за пределами цикла while
cout<<s; // выводит string3 (последнюю строку)
cout<<s[0]; // выводит первый символ последней строки s

Как вывести любую другую строчку?

Можно просто массив дополнительный ввести и там сохранять каждую строчку как элемент?
Код

string content[] = {"string1", "string2", "string3"};
cout << content[1] // string2




Автор: boriska 15.5.2007, 01:42
Redstuff, внимательнее читай, я же тебе писал уже...
У тебя есть указатель string831 *x, который указывает на твой массив динамически размещенный в памяти,
его и используй для доступа к элементам этого массива.
Т.е. 
Код

for(int i = 0; i < N; ++i)
       cout << x[i];


а вообще конечно  сядь и прочти вводный курс по с++, ибо ты "плаваешь" в элементарных вещах   smile  

Автор: JackYF 15.5.2007, 16:52
Цитата(Redstuff @  15.5.2007,  00:02 Найти цитируемый пост)
strcmp(s,"string2/n")==0


Ну, во-первых, спецсимвол '\n' (слэш в обратную сторону), а во-вторых, такое при вводе в строку не пишется (если очень не извратнуться) и поэтому не проверяется...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)