Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
#1

Текст с Екселя в Матрицу - C++

26.11.2009, 18:56. Просмотров 906. Ответов 14
Метки нет (Все метки)

Доброго времени суток!

Не могли бы вы подсказать следующее...
1. нужно открыть файл для чтения (Excel файл сохраненный в формате "csv с разделителями").
C++
1
2
FILE *file
fopen("file.csv","r");
2. Текст в файле такого вида:
первое;второе;третье
четвертое;пятое;шестое
Нужно это дело (слова до разделителя) забить в двумерный массив. Как быть с концами и началами строк я не знаю, может временные ; в начале и в конце добавить?
тойсь примерный вид должен быть похож на что-то такое(присвоение):
C++
1
2
3
array[1,1]="первое"    array[1,2]="второе"     array[1,3]="третье"
 array[2,1]="четвертое" .....
// нумерация кажется с ноля должна быть :) стыдно, пойду книги листать
3. От разделителя до разделителя слова в массивах, дальше по поиску уже сам перестановку напишу, лет 7 назад на Паскале писал, знания еще не восстановились даже на таком простом



помогите хоть кусочками кода, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2009, 18:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Текст с Екселя в Матрицу (C++):

записать текст в матрицу по строкам, а затем переписать по спирали от центра. Прочитать зашифрованный текст - C++
Зашифровать текст следующим образом: записать его в матрицу по строкам, а затем переписать по спирали от центра. Прочитать зашифрованный...

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

Текст записывается в квадратную матрицу, а затем прочитывается по спирали, начиная с центра - C++
Всем доброго времени суток! Кому не сложно, взгляните, пожалуйста. Дан текстовый файл, содержащий текст, который должен быть...

Непонятно условие задачи: Вывести исходную матрицу, преобразованную матрицу и вектор Х. - C++
Здравствуйте, помогите пожалуйста понять, что от меня хотят в этом условии: "Строки вещественной матрицы упорядочить по возрастанию ее...

Заполнить матрицу случайными числами. Вернуть матрицу на 90o по часовой стрелке - C++
Заполнить матрицу случайными числами. Вернуть матрицу на 90o по часовой стрелке.

Получить матрицу из чисел, заполняющих матрицу по линиям, параллельным главной диагонали - C++
Получить матрицу A=(aij), i,j=1..n, n<=100, элементами которой является ряд натуральных чисел, заполняющих матрицу по линиям параллельным...

14
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
26.11.2009, 19:05 #2
Копайте в сторону функции
C
1
char * strtok ( char * str, const char * delimiters );
http://www.cplusplus.com/reference/clibrary/cstring/strtok/
0
Даемоник
42 / 42 / 3
Регистрация: 22.05.2009
Сообщений: 97
26.11.2009, 19:09 #3
Можно попробовать что-то типа:
Кусочек..
C++
1
2
3
4
5
6
7
8
9
10
11
12
const int size=15;
int i=0;
int j=0;
FILE fp;
char array[size][size];
while((array[i][j]=getc(fp))!=EOF)
{
   if(array[i][j]==";")
      j++;
   if(array[i][j]=="\n")
      i++;
}
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
26.11.2009, 19:12  [ТС] #4
хм, идея понятна, а вот оно будет ли считывать между ; и двигать дальше?
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
26.11.2009, 19:34 #5
Цитата Сообщение от miff Посмотреть сообщение
хм, идея понятна, а вот оно будет ли считывать между ; и двигать дальше?
вам для дела или по учёбе? просто на С++ проще гораздо организовать подобную парсировку.
или именно С интересует?
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
26.11.2009, 20:16  [ТС] #6
вообще для работы, отчет нужно "укоротить", вообще интересует именно на с++
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
26.11.2009, 20:37 #7
что такое vector знаете?
или именно вывод в массив нужен в виде arr[][]; ?

Добавлено через 10 минут
вот на скорую
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
using namespace std;
 
vector<string> Parseline(string & str)
{
    vector<string> line;
    string buf;
    int index;
    while ((index=str.find_first_of(";"))!=string::npos)
    {
        buf=str.substr(0,index);
        line.push_back(buf);
        str=str.substr(index+1);
    } // end while
 
    if (!str.empty()) line.push_back(str);
    return line;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char *File="file.csv";
    string str;
    vector<vector<string> > text;
    
 
    ifstream f(File);
    if (!(f.is_open()))  // проверка наличия файла с тестом
    { cout<<"ERROR: not file "<<File; system("pause"); exit(1); }
    
    while(!f.eof()) // чтении из файла
    {   
        getline(f, str);
        text.push_back(Parseline(str));
    }   
 
    f.close();
    int numb=0;
    for (vector<vector<string> >::iterator itLine=text.begin(); itLine!=text.end(); itLine++)
    {   cout<<"\nstring "<<++numb<<": ";
        for (vector<string>::iterator it=(*itLine).begin(); it!=(*itLine).end(); it++)
            cout<<" "<<(*it);
    }
 
    cout<<endl; system("PAUSE");
    return 0;
}
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
26.11.2009, 22:56  [ТС] #8
там придется колонками манипулировать, так что думаю вектор не самое лучшее решение. Но всеравно спасибо и за этот код, может что и возьму для себя полезное. А через массив есть задумки как сделать можно?
0
Том Ардер
Модератор
Эксперт по математике/физике
3776 / 2389 / 304
Регистрация: 15.06.2009
Сообщений: 4,310
27.11.2009, 03:01 #9
Вот пример разборки файла по словам

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <windows.h>
 
#include <iostream>
#include <fstream>
#include <strstream>
using namespace std;
 
char* Rus(const char* text);
 
char bufRus[256];
char* Rus(const char* text)
{
   CharToOem(text, bufRus);
   return bufRus;
}
 
int main()
{
    const int   WORDS = 10;             // слов в строке, не более
    const int   SIZE = 20;              // максимальная длина одного слова
    char        words[WORDS][SIZE];     // все слова из одной строки
    ifstream    ifExcel( "file.csv" );
 
    if( !ifExcel.fail() )
    {
        const int   nBufSize = 256;     // максимальная длина строки в файле
        char        Buffer[nBufSize];   // содержимое строки
 
        while( !ifExcel.eof() )
        {
            ifExcel.getline( Buffer, nBufSize );
 
            istrstream  text( Buffer );
            int         w = 0;
 
            while( !text.eof() )
            {
                text.get( words[w], SIZE, ';' );    // читать текущее слово (до разделителя)
                text.get();                         // пропустить разделитель
 
                cout << Rus( words[w] ) << " ";
 
                // здесь формировать массив слов, что-то вроде
                // array[current_row][w] = words[w];
        
                w++;
            }
            cout << endl;
        }
    }
    
    system("pause");
    
    return 0;
}
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
27.11.2009, 03:15  [ТС] #10
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
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
     char str[]="pos1;pos2;pos3";
     char buff[7];
     string array[5];
     int size;
     int i;
     int j;
     int f;
     j=1;
     f=0;
     size=strlen(str);
     for (i=0; i<size+1; i++) 
      { 
        if (str[i]!=';') 
           {
           buff[f]=str[i];
           f++;
           } //закрываем if
        if ((str[i]==';')||(str[i]=='\0'))
           {
           buff[f]='\0'; 
           array[j]=buff; 
           f=0;
           j++;
           }
                
        }//закрываем for
      for (i=1;i<j;i++) {cout<<array[i]<<" ";}
cin>>i;
     return 0;   
}
поэкспериментировал немножко, и на свет появился этот совсем не оптимизированый код, который с головы до пят загружен тормознутыми if'ами, сильно-жрущей ресурсы переборкой всего по одному символу... и кучей, не совсем верно созданных, переменных. Но зато логическое мышление где-то в недрах головы начало опять вылезать

уже завтра это дело перепишу под двумерный массив, и нужно будет прикрепить файлик для читания. Главное чтобы правильно всё по массивам стало



_______
Том Андер, спасибо за Ваш код. Он мне очень еще поможет
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
30.11.2009, 17:22  [ТС] #11
подскажите как правильно читать по строчке файлик? или хороший доходчивый источник по этому пункту, пожалуйста, дайте ссылочку. Вообще интересно только "прочитать строку 1, прочитать строку 2....". Мой стиль написания программ понятен из поста выше, так что если кто своими словами поможет описать, то на "языке Богов" с первого раза могу не понять

спасибо заранее

Добавлено через 50 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main()
{
  int      n = 0;
  ifstream is( "test.txt" );
  string   sbuf;
 
  while (!is.eof()) {
    getline( is, sbuf, '\n' );
    n++;
    cout << n << ": '" << sbuf << "'" << endl;
  }
  cin>>n;
  return 0;
}
вот накопал интересный пример наглядного чтения по строкам, может кому будет полезен в будущем. Когда нашел там была ошибка когда в вечный цикл забрасывало, то поправил
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
30.11.2009, 18:01 #12
miff, Хорошая привычка - проверять, открылся ли файл. Ну и за состоянием потока следить...
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
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
 
/* чтение файла по строкам */
 
int main(){
    std::ifstream fin("1.txt");
    if ( !fin.is_open() ){
        std::cerr << "Can't open file!" << std::endl;
        return 1;
    }
    
    std::string buf;
    size_t i = 0;
    bool is_bad;
    
    while ( getline(fin, buf) )
        std::cout << std::setw(3) << (++i) << ":\t" << buf << std::endl;
    
    if ( (is_bad = fin.bad()) == true )
        std::cerr << "Error while reading file!" << std::endl;
    
    fin.close();
    return ( is_bad ) ? 1 : 0;
}
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
30.11.2009, 20:31  [ТС] #13
угу, это понятно....но вот вопрос, у меня ругань идет что string в char не может перейти из моего кода выше видно что своими силами (насколько я умею) перебираю посимвольно, а в Вашем примере не могу взять строку и разбить её на символы для внедрения в свой код, вот как бы тут лучше поступить?

Добавлено через 11 минут
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
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <stdlib.h>
#include <fstream>
 
using namespace std;
int main()
{
     ifstream is( "test.txt" ); //читаем строку
     string   sbuf;   //временная строка
 
     char str[20];    // ?? строка файла моя прерыдущая 
     char buff[20];   //временный буфер где посимвольно пишутся символы до определенного знака
                      //после чего загоняются в array[i]
     string array[50]; //массив где хранятся готовые куски
     int size;        //взятие количества символов в строке
     int i;           // переменная для определенного символа
     int j;
     int f;
     j=1;
     f=0;
     
     while (!is.eof()) {    
     getline( is, sbuf, '\n' );
    // size=strlen(sbuf);
    // for (i=0; i<size+1; i++)
      //{
           cout<<" buffer:"<<i<< " - "<<sbuf[i]<<endl;
           cout<<" easy buffer: "<<sbuf<<endl;
        if (sbuf[i]!=';') 
           {
           buff[f]=sbuf[i];
           f++;
           } //закрываем if
        if ((sbuf[i]==';')||(sbuf[i]=='\0'))
           {
           buff[f]='\0'; 
           array[j]=buff; 
           f=0;
           j++;
           }
       //    } //закрываем For
      //     cout<<sbuf<<" :::Buffer ";
        }//закрываем while
      //for (i=1;i<j;i++) {cout<<array[i]<<" "<<'\n';}
      //cout<<array[3];
      //cout<<array[5];
cin>>i;
     return 0;   
}
содержание файла:
11;22;33;44
55;66;77;8
Результат работы программы:
buffer:217088 - H
easy buffer: 11;22;33;44
buffer:217088 - H
easy buffer: 55;66;77;8
buffer - это я старался взять обращение переменной sbuf по типу sbuf[i]
easy buffer - результат sbuf...как видно что строке там живеться хорошо...но как обращаться к символу этой строки?

Добавлено через 49 минут
вроде получилось решить
C++
1
strcpy(str,sbuf.c_str());
Добавлено через 1 час 24 минуты
вопрос можно?

кодировку русскую не держит, считывает из файла аероглифы
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
01.12.2009, 15:08  [ТС] #14
если в файле встречаются " когда по символам перебираю, то как правильно присвоить пустоту чтобы пропускало? str[i]=' '; и str=[i]=''; документ или не сохраняют, или все слова отбрасывает
0
miff
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 11
02.12.2009, 13:20  [ТС] #15
тему можно закрыть, написал. Всем огромная благодарность за помощь
0
02.12.2009, 13:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2009, 13:20
Привет! Вот еще темы с ответами:

Сформировать квадратную матрицу; транспонировать матрицу и инвертировать порядок элементов каждой ее строки - C++
Заданы два одномерных массива одинаковой длины: R и S.Сформировать квадратную матрицу A, каждый элемент которой, что находится в i-той...

Заполнить матрицу случайными числами. Развернуть матрицу на 90(градусов) против часовой стрелки - C++
Заполнить матрицу случайными числами. Развернуть матрицу на 90o против часовой стрелки

Заполнить матрицу 9x9 случайными числами. Отобразить матрицу симметрично относительно главной диагонали - C++
Заполнить матрицу случайными числами. Отобразить матрицу симметрично относительно главной диагонали

Вывести матрицу B и из этой матрицы В вычесть единичную матрицу А - C++
Задание такое, нужно вывести матрицу B размером n*n, и из этой матрицы В вычесть единичную матрицу А. я решил вывести на экран сначала...


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

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

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