Премини към съдържанието
  • Добре дошли!

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

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

     

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


frozener
 Сподели

Препоръчан отговор

Здравейте,

Днес ми дадоха задача за която трябва да прочета текстов файл не чрез С код (тоест не чрез 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;
}

 

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

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

Линк към коментара
Сподели в други сайтове

преди 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

Линк към коментара
Сподели в други сайтове

Добавете отговор

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

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

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

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

 Сподели

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване