Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Прочитати матрицю з файлу

with 22 comments

Думаєте просто? І я так думав.

Таки зробив, не знаю чи найкращим чином, але добре що добрі люди допомогли.

С++ STL

#include <vector> //for datatypes
#include <sstream> //for istringstream 
#include <fstream> // for ifstream
#include <iostream> // for cerr, cout
#include <string> // for string type
using namespace std;

vector<int> readRow(string row)
{
	vector<int> retval;
	istringstream is;
	is.str(row);
	int num;
	while (is >> num) retval.push_back(num);
	return retval;
}

vector< vector<int> > readVector(istream &is) 
{
	string line;
	vector<vector<int> > retval;
	while (getline(is, line))
		retval.push_back(readRow(line));
	return retval;
}

int main()
{
	ifstream infile("test.txt");
	if(!infile){
		cerr << "Error! Cant open file test.txt";
		return -1;
	}
	vector< vector<int> > data = readVector(infile);
	int rows = data.size();
	int cols = data[0].size();
	int i,j;
	for(i=0;i<rows;i++)
	{
		for(j=0;j<cols;j++)
		{
			cout << data[i][j] << " ";
		}
		cout << endl;
	}
}

Так це я такий, чи це C++ такий?

C++ без STL, масив має максимальний розмір

#include <sstream> //for istringstream 
#include <fstream> // for ifstream
#include <iostream> // for cerr, cout
#include <string> // for string type
using namespace std;

const int maxwidth=1000;
const int maxheight=100;
int x=0,y=0;
int width,height;
int array[maxwidth][maxheight];

void readRow(string row)
{
	istringstream is;
	is.str(row);
	x = 0;
	int num;
	while (is >> num) {
		array[x][y] = num;
		x++;}
	width=x;
}

void readVector(istream &is) 
{
	string line;
	y=0;
	while (getline(is, line)){
		readRow(line);
		y++;
		}
	height = y;
}

int main()
{
	ifstream infile("test.txt");
	if(!infile){
		cerr << "Error! Cant open file test.txt";
		return -1;
	}
	readVector(infile);
	int i,j;
	for(i=0;i<height;i++)
	{
		for(j=0;j<width;j++)
		{
			cout << array[j][i] << " ";
		}
		cout << endl;
	}
}

Python

f = open("test.txt")
lns = f.readlines()
nums = map(lambda x: x[:-1].split(" "),lns)
for i in nums:
    for j in i:
        print float(j)+0.1,
    print

# OUT: 1.1 2.1 3.1 4.1 5.1
# OUT: 6.1 7.1 8.1 9.1 0.1
# OUT: 9.1 8.1 7.1 6.1 5.1

Порівняйте розміри коду, враховуючи те, що в C++ використовується той же stl, і я не забув using namespace std; , як дехто робить щоб загадити код префіксами.

Знаєте як краще, чи маєте питання – пишіть нижче.

Advertisements

Written by bunyk

Лютий 22, 2011 at 00:17

Оприлюднено в Кодерство, Конспекти

Tagged with ,

Відповідей: 22

Subscribe to comments with RSS.

  1. Ты с ума что ли сошел? 🙂

    /* start */
    for (int i=0; i<n; i++)    // line 1 ..
      for (int j=0; j<n; j++)  // line 2 ?
        cin >> data[i][j];     // line 3 !!!
    /* end */
    

    только не говори, что n заранее неизвестно (потому что никакой нормальный человек не будет сохранять матрицу просто так, без размеров)

    jtimv

    Лютий 22, 2011 at 00:35

    • Ага. В С++ не буде, бо це тягне за собою геморой як вище. Але що ти зробиш якщо тебе поставили перед фактом (файлом)? блеять! 🙂

      bunyk

      Лютий 22, 2011 at 01:16

    • P.S. Дякую за об’єктивну оцінку. Це я твій 0чан метод освоюю.

      bunyk

      Лютий 22, 2011 at 01:18

      • я буду писать на Java

        String[] row = Scanner.nextLine().split(" ");
        

        как-то так. Ну вообще да, можно найти такие примеры, где на каком-то языке прогать будет неудобно.
        Хотя не вижу проблем написать на C++ свою Split(string x) с блэкджеком.
        p.s. у меня не 0-чан, у меня 2-ч ))

        jtimv

        Лютий 22, 2011 at 02:39

  2. Фу, С++. Можеш тут глянути, який жахливий асемблерний код генерується по твому рішенню.

    danbst

    Лютий 22, 2011 at 09:37

    • Фу, твоя критика неконструктивна. 🙂

      bunyk

      Лютий 22, 2011 at 13:35

      • Жаль, не воно не зберегло той асемблерний код. А ти, звісно, не спробував це наново зробити. А отже твоє заперечення критики абсолютно необ’єктивне і моя критика має право бути конструктивною.

        А по темі: зчитуємо перший рядок у одинарному циклі, проте не запам’ятовуємо – взнаємо ширину матриці. Потім зчитуємо у вектор всі числа, одновимірний вектор. А третім кроком створюємо динамічний масив потрібного розміру і за допомгою memcpy копіюємо в нього дані з вектору. Voila!

        danbst

        Лютий 22, 2011 at 21:47

        • Як зчитати перший рядок в одинарному циклі, і як виявити endl?

          Я вже не прошу в тебе коду, бо звісно кожна реалізація портить ідею :).

          bunyk

          Лютий 22, 2011 at 21:55

          • Ну ок, ок. На С++ можливо робити тільки оті огидні рішення, які приведено вище.

            danbst

            Лютий 22, 2011 at 22:31

  3. (map (fn[line]
                (map #(Integer/parseInt %) (.split line " ")))
               (read-lines "foo.txt"))
    

    Всем чмоки в этом чате.

    alexyakushev

    Лютий 22, 2011 at 22:33

    • Clojure рулить!

      Python

      Березень 1, 2011 at 21:28

    • Ха, на K

      matrix:.:'0:"matrix"

      0: – зчитує текстовий файл у масив
      :’ – це map або foreach. В даному випадку прохід відбувається по рядкам
      . – це eval

      Розміри матриці:

      #*matrix - columns
      #matrix  - rows
      

      danbst

      Квітень 23, 2011 at 07:45

  4. Айяйяй, а ітератори де?)

    dmytrish

    Лютий 24, 2011 at 15:55

    • А ітератори я видалив, бо з ними код був ще страшніший:

      for(vector < vector <int> >::iterator i= data.begin(); i!=data.end();i++)
      

      Бррр…

      bunyk

      Лютий 24, 2011 at 16:07

  5. #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    #include <iterator>
    using namespace std;
    
    int main(int argc, char **argv)
    {
        ifstream fin(argv[1]);
        
        typedef vector<double> double_vector;
        typedef vector<double_vector> double_matrix;
        double_matrix matrix;
        // input
        string line;
        while (fin) {
            getline(fin, line);
            stringstream ss(line, ios_base::in);
            double_vector raw;
            double a;
            while (ss >> a) 
                raw.push_back(a);
            matrix.push_back(raw);
        }
        
        // output
    
       
        for (double_matrix::iterator i = matrix.begin(); i != matrix.end(); ++i) {
            for (double_vector::iterator j = i->begin(); j != i->end(); ++j)
                cout << *j << '\t';
            cout << endl;
        }
    }
    

    Не Пітон за читабельністю і швидкість не радує, як на С++, але нічого кошмарного не бачу.

    dmytrish

    Березень 3, 2011 at 19:59

    • Перепрошую за з’їдені темплейти, в перший раз пишу комент на вордпресі з знаками порівняння

      dmytrish

      Березень 3, 2011 at 20:02

  6. dmytrish

    Березень 3, 2011 at 20:04

    • Взяв на себе сміливість відредагувати ваш коментар, сподіваюсь смисл не змінився.

      34 рядки це вже набагато краще. Дякую.

      А оце все – звичайна допомога брату-фізику. І трохи cпаму, мій блог часто за подібними запитами знаходять, значить річ потрібна. 🙂

      bunyk

      Березень 3, 2011 at 20:11

  7. for raw in nums: floats.append(map(lambda x: float(x), raw))
    

    — ну і це було нечесно забувати

    dmytrish

    Березень 3, 2011 at 20:25

  8. А як щодо std::istream_iterator? таким чином можна читати рядок однією командою:
    std::ifstream fin(“my_file.txt”);
    std::copy(std::istream_iterator(fin), std::istream_iterator(), std::back_inserter(my_vector));

    Oliver

    Березень 15, 2011 at 23:30

  9. До кумпанії код на C#

    string[] contents = File.ReadAllLines("test.txt");
    string[][] result = new string[contents.Length][];
    for (int i=0; i<contents.Length; ++i)
            result[i] = contents[i].Split(" ");
    

    Andrii

    Грудень 25, 2011 at 00:56


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: