Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Четене от текстов файл чрез Input redirection

Featured Replies

Здравейте,

Днес ми дадоха задача за която трябва да прочета текстов файл не чрез С код (тоест не чрез FILE *f; fopen()), а чрез сменяне на потока от клавиатура на файл(program < textfile.txt).

Трябва всек ред, който съдържа числа да бъде зареден в масиви тоест за всеки ред по един масив

Проблемът ми е, че не знам как да прочета ред по ред и да заредя всеки ред в масив.

Знам как се чете файл по този начин само чрез fgets и scanf, но те четат всичко и не мога да сплитна след това масива на ред по ред. Чел съм книжките плюс гугъл сърч и не намирам това което ми трябва.

Трябва ми нещо като getline.

Това е единствения начн освен чрез fgets, който знам за четене.

int n[10];
  int i, j;
  j = 0;

  while(scanf("%d", &i) != EOF)
  {

    n[j] = i;
    printf("%d\n", n[j]);
    j++;

  }

 

преди 21 минути, frozener написа:

освен чрез fgets

има и gets, за четене на ред от конзолата.

Иначе след като си прочел реда, числата можеш да ги извлечеш от стринга със strtol или strtod, и компания, в зависимост от типа.

  • Автор
преди 4 минути, Реджеп Иведик написа:

има и gets, за четене на ред от конзолата.

Иначе след като си прочел реда, числата можеш да ги извлечеш от стринга със strtol или strtod, и компания, в зависимост от типа.

С коя функция да прочета ред по ред? :D 

преди 8 минути, frozener написа:

С коя функция да прочета ред по ред? :D 

Лесно е. Четеш в цикъл. След като прочетеш реда, извличаш числата в масив и повтаряш цикъла, като извличаш числата в следващия масив и т.н.

  • Автор
преди 6 минути, Реджеп Иведик написа:

Лесно е. Четеш в цикъл. След като прочетеш реда, извличаш числата в масив и повтаряш цикъла, като извличаш числата в следващия масив и т.н.

Тоест while(getline(array, size_of_array, stdin) != EOF){} ?

на 1.03.2017 г. в 21:05, frozener написа:

Тоест while(getline(array, size_of_array, stdin) != EOF){} ?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
	int* ip;
	int size;
	int capacity;
}intvector;

intvector* intvectorInit()
{
	intvector* ivp = (intvector*)malloc(sizeof(intvector));
	ivp->ip = (int*)malloc(10 * sizeof(int));
	ivp->capacity = 10;
	ivp->size = 0;
	return ivp;
}

void intvectorDestroy(intvector* ivp)
{
	free(ivp->ip);
	ivp->ip = 0;
	free(ivp);
	ivp = 0;
}

void intvectorClear(intvector** ivp)
{
	intvectorDestroy(*ivp);
	*ivp = intvectorInit();
}

void intvector_pushback(intvector* ivp, int n)
{
	if (ivp->size == ivp->capacity)
	{
		ivp->ip = (int*)realloc(ivp->ip, 2 * ivp->capacity * sizeof(int));
		ivp->capacity = 2 * ivp->capacity;
	}
	ivp->ip[ivp->size] = n;
	ivp->size++;
}

typedef struct
{
	char* cp;
	int size;
	int capacity;
}narrowstring;

narrowstring* narrowstringInit()
{
	narrowstring* nsp = (narrowstring*)malloc(sizeof(narrowstring));
	nsp->cp = (char*)malloc(10 * sizeof(char));
	nsp->capacity = 10;
	nsp->size = 0;
	return nsp;
}

void narrowstringDestroy(narrowstring* nsp)
{
	free(nsp->cp);
	nsp->cp = 0;
	free(nsp);
	nsp = 0;
}

void narrowstringClear(narrowstring** s)
{
	narrowstringDestroy(*s);
	*s = narrowstringInit();
}

void narrowstring_pushback(narrowstring* nsp, char c)
{
	if (nsp->size == nsp->capacity)
	{
		nsp->cp = (char*)realloc(nsp->cp, 2 * nsp->capacity * sizeof(char));
		nsp->capacity = 2 * nsp->capacity;
	}
	nsp->cp[nsp->size] = c;
	nsp->size++;
}

typedef struct
{
	intvector* ivp;
	int size;
	int capacity;
}intvectorvector;

intvectorvector* intvectorvectorInit()
{
	intvectorvector* ivvp = (intvectorvector*)malloc(sizeof(intvectorvector));
	ivvp->ivp = (intvector*)malloc(10 * sizeof(intvector));
	ivvp->capacity = 10;
	ivvp->size = 0;
	return ivvp;
}

void intvectorvectorDestroy(intvectorvector* ivvp)
{
	int i;
	for (i = 0; i < ivvp->size; i++)
	{
		free ((ivvp->ivp[i]).ip);
	}
	free(ivvp->ivp);
	ivvp->ivp = 0;
	free(ivvp);
	ivvp = 0;
}

void intvectorvector_pushback(intvectorvector* ivvp, intvector* ivp)
{
	if (ivvp->size == ivvp->capacity)
	{
		ivvp->ivp = (intvector*)realloc(ivvp->ivp, 2 * ivvp->capacity * sizeof(intvector));
		ivvp->capacity = 2 * ivvp->capacity;
	}
	ivvp->ivp[ivvp->size].size = ivp->size;
	ivvp->ivp[ivvp->size].capacity = ivp->capacity;
	ivvp->ivp[ivvp->size].ip = (int*)malloc(ivp->capacity * sizeof(int));
	for (int i = 0; i < ivp->size; i++)
	{
		ivvp->ivp[ivvp->size].ip[i] = ivp->ip[i];
	}
	ivvp->size++;
}

void getline(narrowstring** s)
{
	int c;
	narrowstringClear(s);
	while (((c = getc(stdin)) != '\r') && (c != '\n'))
	{
		if (c == EOF)
		{
			return;
		}
		narrowstring_pushback(*s, (char)c);

	}
	
}

void narrowprint(narrowstring* s)
{
	int i;
	for (i = 0; i < s->size; i++)
	{
		putchar(s->cp[i]);
	}
}

void rtrim(char* cp)
{
	char* conductor = &cp[strlen(cp) - 1];
	while (*conductor == ' ')
	{
		*conductor = 0;
		conductor--;
	}
}

int main()
{
	char* endp;
	char* temp;
	int i, j;
	narrowstring* s = narrowstringInit();
	intvector* ivp = intvectorInit();
	intvectorvector* ivvp = intvectorvectorInit();
	for (i = 0;; i++)
	{
		printf("Input integers separated by space !!!\n");
		getline(&s);
		if (s->size == 0) break;
		temp = (char*)malloc((s->size + 1) * sizeof(char));
		temp[s->size] = 0;
		for (j = 0; j < s->size; j++)
		{
			temp[j] = s->cp[j];
		}
		endp = temp;
		rtrim(endp);
		intvectorClear(&ivp);
		while (*endp)
		{
			intvector_pushback(ivp, strtol(endp, &endp, 10));
		}
		free(temp);
		intvectorvector_pushback(ivvp, ivp);
	}

	printf("\n\n");
	for (i = 0; i < ivvp->size; i++)
	{
		for (j = 0; j < ivvp->ivp[i].size; j++)
		{
			printf("%d ", ivvp->ivp[i].ip[j]);
		}
		printf("\n");
	}
	intvectorvectorDestroy(ivvp);
	narrowstringDestroy(s);
	intvectorDestroy(ivp);
    return 0;
}

 

Енд оф файл на уиндоус се симулира с контрол + зет задължително на нов ред

На другите системи не знам как е. 

Много слаб код, заделяш памет, когато унищожаваш обекти ?! STL затова е написан, за да не пишат подобни тъпизми.

преди 1 час, bvbfan написа:

Много слаб код, заделяш памет, когато унищожаваш обекти ?! STL затова е написан, за да не пишат подобни тъпизми.

Който ти е казал, че го разбираш езика "С", лекинко те е поизлъгал май.

Слабости в кода има, каствам малока, щото ползвам иде със С++, а на С++ като не кастваш малока е грешка. Ако разбираше от С, щеше да забележиш, а не да пишеш неща, дето ги няма. Къде заделям памет в деструкторите ?

Естествено не правя проверки за бад алокейшън, щото човека не пита за това.

Слабостите в кода ти са много повече от колкото може да предположиш, никъде не се поменава, че трябва да се напише на С.

преди 2 минути, bvbfan написа:

Слабостите в кода ти са много повече от колкото може да предположиш, никъде не се поменава, че трябва да се напише на С.

Подразбира се.

Самочувствието ти е явно много по голямо от покритието, но явно няма как да забележиш.

 

Естествено условието е малко или много неясно. Ето нещо просто.

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

struct IntArray
{
    int size;
    int *arr;
    
    IntArray() {
        arr = new int[100];
        size = 0;
    }
    
    void push(int x) {
        arr[size++] = x;
    }
  
    ~IntArray() {
        delete []arr;
    }
};

IntArray a[1024];

int main()
{
    int k = 0, j = 0, x;
    string str;
    while (getline(cin, str)) {
        istringstream input(str);
        while (input >> x) a[k].push(x);
        ++k;
    }
    
    for (int i = 0; i < k; ++i) {
        for (j = 0; j < a[i].size; ++j) {
            cout << a[i].arr[j] << " ";
        }
        cout << "\n";
    }
    
   return 0;
}

По правилното е естественo с vector, но пък в условието пише масиви :)

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

int main()
{
	vector<int> vi;
	vector<vector<int>> vvi;
	string s;
	stringstream ss;
	int n;
	while (getline(cin, s))
	{
		vi.clear();
		ss = stringstream(s);
		while (ss >> n)
		{
			vi.push_back(n);			
		}
		vvi.push_back(vi);
	}
	int i, j;
	for (i = 0; i < vvi.size(); i++)
	{
		for (j = 0; j < vi.size(); j++)
		{
			cout << vvi[i][j] << " ";
		}
		cout << endl;
	}
}

 

На C++ без хандикап

  • 2 седмици по-късно...
  • Автор
на 3/4/2017 в 12:32, Реджеп Иведик написа:

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

int main()
{
	vector<int> vi;
	vector<vector<int>> vvi;
	string s;
	stringstream ss;
	int n;
	while (getline(cin, s))
	{
		vi.clear();
		ss = stringstream(s);
		while (ss >> n)
		{
			vi.push_back(n);			
		}
		vvi.push_back(vi);
	}
	int i, j;
	for (i = 0; i < vvi.size(); i++)
	{
		for (j = 0; j < vi.size(); j++)
		{
			cout << vvi[i][j] << " ";
		}
		cout << endl;
	}
}

 

На C++ без хандикап

Мерси да кода но лектора ми обясни - релно трудната част е да знаеш поведението на cin/scanf, тоест 

cin >> n1; чете първото чусло на първия ред от файла

cin >> n2; чете второто на първия ред и тн.

ика се програмата чрез бат файл 

program > input.txt < output. txt

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.