• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed (C++) Jak dodać dane z pliku a następnie zapisać w nowym

VPS Starter Arubacloud
0 głosów
799 wizyt
pytanie zadane 15 kwietnia 2021 w C i C++ przez Monika02 Początkujący (270 p.)
zamknięte 15 kwietnia 2021 przez Monika02
Nie wiem jak to zrobić muszę pobrać dane z pliku zewnętrznego a następnie obliczyć sumę cyfr i zapisanie wyniku w nowym pliku.txt. Jak wyciągnąć dane z pliku i nad nimi pracować właśnie z tym mam problem.
komentarz zamknięcia: Dostałam odpowidź z której jestem zadowolona

1 odpowiedź

+1 głos
odpowiedź 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
wybrane 15 kwietnia 2021 przez ScriptyChris
 
Najlepsza

Jak wyciągnąć dane z pliku i nad nimi pracować właśnie z tym mam problem.

Kilka pierwszych materiałów po wpisaniu w Google: "C++, praca na plikach":

https://www.youtube.com/watch?v=h2Taf16gQDI

https://cpp0x.pl/kursy/Kurs-C++/Dodatkowe-materialy/Obsluga-plikow/305

http://shebang.pl/kursy/programowanie-cpp/r9-pliki/

Zachęcam do tego, by uczyć się wyszukiwać tak ogólne informacje samemu czasami. Jest to dość cenna umiejętność wink

 

komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
chodzi mi o działania na plikach dodawanie liczb znajdujących się w pliku lub np pesel wyciągnie daty urodzenia a następnie zapisanie w nowym pliku pesel, datę urodzenia oraz sumę cyfr daty urodzenia. O to mi chodziło. Jeśli źle sformułowałam zadanie to sory.
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
Chodzi mi typowo o pracę nad danymi wyciągnietymi z pliku.
1
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
edycja 15 kwietnia 2021 przez ScriptyChris
#include <iostream>
#include <stdio.h>
#include <fstream>
 
using namespace std;
 
int liczbaPliku,wynik;
fstream plik;
 
int main()
{
    
    FILE* plik;
 
    plik = fopen("pesel.txt", "r");
 
    char znak;
 
    do
    {
        znak = fgetc(plik);
        cout << znak << endl;
    }
    while(znak != EOF);
 
    fclose(plik);
 
    cout << "Liczba z pliku: " << liczbaPliku << endl;

 
 
    cout << "Oto wynik: " << wynik << endl;
 
    getchar();
 
    ofstream zapis("pesel_suma.txt");
    {
        cout << "!ERROR! Nie udalo sie wczytac pliku.";
        getchar();
 
        return 0;
    }
    
    zapis << wynik;
 
    return 0;
}

[@Monika02, na przyszłość proszę umieszczać kod w bloczku]

komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
Coś takiego wyszyłam i nie wiem co dalej
komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
edycja 15 kwietnia 2021 przez Jakub 0

Nie rozumiem dlaczego używasz w c++ narzędzia z C zamiast std::fstream ( nawet dodałaś bibliotekę fstream ). Używając biblioteki standardowej, program dodający liczby z pliku, i zapisujący wynik do innego, mógłby wyglądać tak:

#include <iostream>
#include <fstream>
#include <string>

int main() {
	std::fstream file;
	file.open("liczby.txt", std::ios::in);

	if (!file.is_open()) {
		// nie udało się otworzyć pliku
		return -1;
	}

	int sum = 0;
	int input;
	while (file >> input) {
		sum += input;
	}

	file.close();

	std::cout << "sum is: " << sum << "\n";

	file.open("wynik.txt", std::ios::out);

	if (!file.is_open()) {
		// nie udało się otworzyć pliku
		return -1;
	}

	file << sum;

	file.close(); 

}

Tutaj zakładam, że liczby są odseparowane spacją:

1 2 3 4 5 6 7

Oczywiście, całość wyglądała by inaczej dla innego problemu, załóżmy że data urodzenia jest zapisana w następującej formie, np:

18.10.2001

no więc zaczynasz tak:

#include <iostream>
#include <fstream>
#include <string>
#include <cctype>

int main() {
	std::fstream file;
	file.open("data.txt", std::ios::in);

	if (!file.is_open()) {
		return -1;
	}

	std::string date;
	file >> date;

	std::cout << "date: " << date << "\n";

	int sum = 0;

	for (char const &c : date) {
                // upewniasz się, że znak to cyfra, a nie '.'
		if (std::isdigit(c)) {
                        // odjęcie znaku '0' od kodu asci to taki lifehack by zamienić cyfrę jako znak, na liczbę
			sum += (c - '0');
		}
	}

	std::cout << "sum: " << sum << "\n";
}

pobierasz datę z pliku jako tekst. Dalej sumujesz jej cyfry. Potem możesz zapisać sumę do innego pliku.

Wszystko zależy od struktury twoich danych wejściowych. Logika jaką wykonujesz na pobranych z pliku danych, nie ma już nic wspólnego z samym wejściem/wyjściem plikowym.

komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
edycja 15 kwietnia 2021 przez Monika02
Ogólnie to date mam wyciągnąć z peselu. Więc nie wiem jak mam to zrobić.
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)

@Jakub 0, Nie bardzo ogarniam programowanie. Ale jak kompiluję to w wierszu 18 wyskakuje błąd nie wiem o co chodzi. Chodzi o program 1

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
Jaki błąd?
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)

jak kompiluję do wyskakuje mi błąd 

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
edycja 15 kwietnia 2021 przez Jakub 0

A używasz C++11? Bo std::stoi wymaga tego standardu.

Ewentualnie możesz bezpośrednio wczytać liczbę z pliku - sam nie wiem czemu tak od początku nie pokazałem:

#include <iostream>
#include <fstream>
#include <string>
 
int main() {
    std::fstream file;
    file.open("liczby.txt", std::ios::in);
 
    if (!file.is_open()) {
        // nie udało się otworzyć pliku
        return -1;
    }
 
    int sum = 0;
    int input; // input zmieniłem na typ int
 
    while (file >> input) {
        sum += input; // konwersja nie jest tu już potrzebna
    }
 
    file.close();
 
    std::cout << "sum is: " << sum << "\n";
 
    file.open("wynik.txt", std::ios::out);
 
    if (!file.is_open()) {
        // nie udało się otworzyć pliku
        return -1;
    }
 
    file << sum;
 
    file.close(); 
 
}

 

 

komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
Git a masz jakąś rade jak wyciągnąć z numeru pesel  datę urodzenia, w nowym pliku pesel_data.txt zapisze pesel, datę urodzenia oraz sumę cyfr daty urodzenia
komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)

Pesel jest zbudowany tak, że:

  • pierwsze dwie cyfry to 2 ostatnie cyfry roku
  • kolejne dwie cyfry do miesiąc
  • kolejne dwie cyfry to rok

Pobierasz więc pesel z pliku (do zmiennej std::string). Następnie wyodrębniasz z tekstu odpowiednie dane, np:

std::string pesel = "05121200000";
std::cout << "year: " << pesel.substr(0, 2) << "\n";
std::cout << "month: " << pesel.substr(2, 2) << "\n";
std::cout << "day: " << pesel.substr(4, 2) << "\n";

std::cout << "whole date: " << pesel.substr(0, 6) << "\n";

Możesz stworzyć zmienną string z datą i tam zapisać wyodrębnione fragmenty.

Mając datę urodzenia, zlicz sumę cyfr (to już pokazywałem wcześniej).

Potem po prostu zapisz wszystkie informacje (pesel, wyodrębnioną datę, sumę cyfr daty) do innego pliku.

komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
Czyli jak powinno to wyglądać z pobraniem danych z pliku
komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)

Tak samo:

std::fstream file;
file.open("pesel.txt", std::ios::in);
...
std::string pesel;
file >> pesel;
...

dalej bez zmian...

1
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
edycja 15 kwietnia 2021 przez Monika02

@Jakub 0,Nie wiem wykleiłam coś takiego. Na pewno nie jest dobrze :(

#include <iostream>
#include <fstream>
#include <string>
  
int main() {
    std::fstream file;
    file.open("pesel.txt", std::ios::in);
  
    if (!file.is_open()) {
        return -1;
    }

	
    std::string pesel;
	file >> pesel;
	
	std::cout << "pesel: " << pesel.substr << "\n";
	std::cout << "rok: " << pesel.substr(0, 2) << "\n";
	std::cout << "miesiac: " << pesel.substr(2, 2) << "\n";
	std::cout << "dzien: " << pesel.substr(4, 2) << "\n";
 	std::cout << "data: " << pesel.substr(0, 6) << "\n";	
 	
 	int sum = 0;
    int input; 
  
    while (data >> input) {
        sum += input; 
    }
    
    file.close();
  
  
    file.open("pesel_data.txt", std::ios::out);
  
    if (!file.is_open()) {
        return -1;
    }
  
    file << pesel.substr;
  
    file.close(); 
  
}

 

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
edycja 15 kwietnia 2021 przez Jakub 0
#include <iostream>
#include <fstream>
#include <string>

int main() {
	std::fstream file;
	file.open("pesel.txt", std::ios::in);

	if (!file.is_open()) {
		return -1;
	}

    // wczytujemy pesel z pliku
	std::string pesel;
	file >> pesel;

	// wyodrębniamy datę
	std::string date = pesel.substr(0, 6);

    // obliczamy sumę cyfr w dacie
    int sum = 0;
	for (char const &c : date) {
		sum += (c - '0');
	}

	file.close();

    // pogląd odczytanych informacji w programie
	std::cout << "pesel: " << pesel << "\n";
	std::cout << "data: " << date << "\n";
	std::cout << "suma cyfr w dacie: " << sum << "\n";


	file.open("pesel_data.txt", std::ios::out);

	if (!file.is_open()) {
		return -1;
	}

    // zapisujemy wyniki do pliku
	file << pesel << "\n";
	file << date << "\n";
	file << sum << "\n";

	file.close();
}

 

komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)

Coś jest nie tak.

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
zamień auto na std::string. Zapomniałem, że nie używasz C++11
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)

Nadal pokazuje 19

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)

Tak zapisz pętle:

for (int i = 0; i < date.size(); ++i) {
   sum += (date[i] - '0');
}

ciężkie życie z tym C++98 masz laugh

komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
Wyświetla wartości zerowe
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
#include <iostream>
#include <fstream>
#include <string>
 
int main() {
    std::fstream file;
    file.open("pesel.txt", std::ios::in);
 
    if (!file.is_open()) {
        return -1;
    }
 
    std::string pesel;
    file >> pesel;
 
    int sum = 0;
    std::string date = pesel.substr(0, 6);
 
    for (int i = 0; i < date.size(); ++i) {
	sum += (date[i] - '0');
	}
 
    file.close();
 
    std::cout << "pesel: " << pesel << "\n";
    std::cout << "data: " << date << "\n";
    std::cout << "suma cyfr w dacie: " << sum << "\n";
 
 
    file.open("pesel_data.txt", std::ios::out);
 
    if (!file.is_open()) {
        return -1;
    }
 
    file << pesel << "\n";
    file << date << "\n";
    file << sum << "\n";
 
    file.close();
}

 

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
A co masz w pliku?
komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
O wejściowy pytam
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
0 2 0 2 1 8 0 1 1 2 1

 

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
Bez spacji ma być. Tak założyłem.
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)

  

Działa

Dzięki wielkie za pomoc i wyrozumiałość

komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
Jak pomogłem to możesz zamknąć pytanie i odznaczyć odpowiedź :)
1
komentarz 15 kwietnia 2021 przez Monika02 Początkujący (270 p.)
Jak byś miał ochotę pomóc mi jeszcze kiedyś było by fajnie
komentarz 15 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
nie jestem jedynym użytkownikiem tego forum :)

Jak będę miał czas to pewnie.

Podobne pytania

0 głosów
0 odpowiedzi 1,684 wizyt
+3 głosów
3 odpowiedzi 538 wizyt
+1 głos
1 odpowiedź 327 wizyt

92,973 zapytań

141,938 odpowiedzi

321,177 komentarzy

62,301 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...