[C++] ifstream, ofstream, kopiowanie tekstu

0

Witam,

Uczę się programowania z książki "Thinking in c++".
Mam problem.
Napisałem kod:

ifstream in("Scopy.txt");  //otwarcie do odczytu
ofstream out("Scopy2.txt"); //otwarcie do zapisu
string s ;
 while(getline(in,s))
    out<<s<< "\n"; */ 

Jeśli dobrze rozumiem, to program powiniem skopiować tekst Scopy.txt do Scopy2.txt??
Program dobrze sie kompiluje i tworzy plik Scopy2, ale jest on pusty.
Proszę o pomoc, bo chciałbym uczyć sie dalej, ale niestety boje sie, że jak coś przegapię, to potem bedzie jeszcze gorzej :)
Dziękuje z góry za pomoc.

1

Podaj pełny kod swego programu, pewnie coś zakomentowałeś (widzę ślady zakończenia komentarzu). W takiej postaci nie powinien się skompilować, więc prawdopodobnie odpalasz nie to co widzisz.

0

Po pierwsze upewnij się, że program rzeczywiście odczytał Scopy.txt. Wypisz coś na standardowe wyjście (cout <<), żeby mieć pewność.
Jeśli się okazuje, że nie odczytał to problem leży w ścieżce pliku. Wtedy najłatwiejszym rozwiązaniem jest podanie pełnej ścieżki do pliku.

0

To jest mój cały kod:

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

using namespace std;

int main()
{
   /* string s1, s2;
    string s3 = "Witaj swiecie";
    string s4("Mam dzisiaj");
    s2 = "urodziny";

    s1 = s3 + " " + s4;
    s1 += " 8 ";
    cout << s1 + s2 + "!"; */

   /*  ifstream in("Scopy.txt");  //otwarcie do odczytu
     ofstream out("Scopy2.txt"); //otwarcie do zapisu
    string s ;
    while(getline(in,s))
        out<<s<< "\n"; */


    ifstream in("D:\C++\Thinking_in_C_plus_plus\scopy.txt");
    ofstream out("D:\C++\Thinking_in_C_plus_plus\scopy4.txt");
    string s , line;
    while(getline(in,s))
        s+=line+ "\n";
    cout << s;


   /* vector<string> v;
    ifstream in("FillVector.cpp");
    string line;
    while(getline(in, line))
        v.push_back(line); //dodanie wiersza na koncu
        for (int i=0; i<v.size(); i++)
            cout << i << ":" << v[i]<< endl; */


    return 0;
}

Wpisałem ścieżkę pliku i dalej tworzy się pusty plik scopy4.txt

W pliku scopy mam takie dane:

dklfdfddvkdvnsdvsdnvkdsnknvdklfdfddvkdvnsdvsdnvkdsnknv
nfnfknfknfkdnfknfkdnfkdnfkdklfdfddvkdvnsdvsdnvkdsnknv
nfnfknfknfkdnfknfkdnfkdnfkdklfdfddvkdvnsdvsdnvkdsnknv
nfnfknfknfkdnfknfkdnfkdnfkdklfdfddvkdvnsdvsdnvkdsnknv
nfnfknfknfkdnfknfkdnfkdnfkdklfdfddvkdvnsdvsdnvkdsnknv
nfnfknfknfkdnfknfkdnfkdnfkdklfdfddvkdvnsdvsdnvkdsnknv
nfnfknfknfkdnfknfkdnfkdnfkdnaknfkanfksdnfksdngksngksgnks

0

Wkleiłem w main, taki kod i za każdym razem pokazuje, że nie otwarto pliku.

 
ifstream plik("scopy.txt"); //otwarcie pliku
string tymczasowa; //zapisywac bedziesz do klasy String
if(!plik.is_open())
cout <<"Nie otwarto pliku!";

while(getline(plik, tymczasowa)) //sczytywanie linijka w linijkę
cout << tymczasowa<< endl;
plik.close();
0
cout<<"To: `"<<"D:\C++\Thinking_in_C_plus_plus\scopy.txt"<<"` próbuję otworzyć"<<endl;

dodaj ten kod i zobacz co się wyświetli

0

Wkleiłem i wyswietlił komunikat:

To: 'D:C++Thinking_in_C_plus_plusscopy.txt' probuje otworzyc

Nie rozumiem. Czemu to nie dziala??

Plik który chce otworzyć, znajduje sie w folderze, gdzie znajduje sie program.

0

Nie działa ponieważ "\t" to nie dwa znaki tylko jeden znak tabulacji, nawet kolorowanie składni to wyraźnie pokazuje.
Co do samego "scopy.txt" to próbujesz otworzyć plik w bieżącym folderze, zaś jeżeli odpalasz pod jakimś środowiskiem to nie koniecznie jest ten folder w którym jest exe.

1

Dwa warianty rozwiązania problemu

ifstream in("D:\\C++\\Thinking_in_C_plus_plus\\scopy.txt");
ifstream in("D:/C++/Thinking_in_C_plus_plus/scopy.txt");
0

Panowie, dziekuje, że pomagacie mi, ponieważ nie mam do kogo się zwrócić o pomoc w nauce :)

Wiec mój fragment kodu wygląda teraz tak:

 
ifstream plik("D:\\C++\\Thinking_in_C_plus_plus\\scopy.txt"); //otwarcie pliku
string tymczasowa; //zapisywac bede do klasy String
if(!plik.is_open())
cout <<"Nie otwarto pliku!";
cout<<"To: `"<<"scopy.txt"<<"` probuje otworzyc"<<endl;


while(getline(plik, tymczasowa)) //sczytywanie linijka w linijkê
cout << tymczasowa<< endl;
plik.close();

cout<<"To: `"<<"scopy.txt"<<"` probuje otworzyc"<<endl;


    ifstream in("D:\\C++\\Thinking_in_C_plus_plus\\scopy.txt");
    ofstream out("scopy3.txt");
    string s , line;
    while(getline(in,s))
        s+=line+ "\n";
    cout << s;

Konsola wyświetla mi:

Nie otwarto pliku!To: 'scopy.txt' probuje otworzyc
TO: 'scopy.txt' probuje otworzyć

Tworzy sie również plik scopy3.txt, który jest pusty :(
Co dalej może być źle?

0

Przecież pisze, że nie może otworzyć pliku. Widocznie masz złą ścieżkę, lub pliku w ogóle tam nie ma.

int OtworzPlik(vector<string>&line)
{
	ifstream in("../test.txt");
	if (!in.is_open())
	{
		cout << "Blad otwarcia pliku" << endl;
		return 0;
	}
	string temp;
	while (getline(in, temp))
	{
		line.push_back(temp);
	}
	return 1;
} 

Przekształć sobie, podaj odpowiednią ścieżkę do pliku, i zadziała.

0

Faktycznie, scieżka była zła. Poprawiłem i jestem pewny na 100%, że scieżka juz jest dobra.

Jednakże dalej program nie działa.

0
kicuch napisał(a):

Faktycznie, scieżka była zła. Poprawiłem i jestem pewny na 100%, że scieżka juz jest dobra.

Jednakże dalej program nie działa.

Wstaw pełen kod, i komunikat błędu, lub opis "nie działania".

0
  ifstream myfile;
  if.open ("example.txt"); 

spróbuj tak otworzyć plik do odczytu

0

Proszę, o to cały kod. Zrobił się strasznie pogmatwany.

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

using namespace std;

void wyswietl(char nazwa_pliku[])
{

}

int main()
{
   /* string s1, s2;
    string s3 = "Witaj swiecie";
    string s4("Mam dzisiaj");
    s2 = "urodziny";

    s1 = s3 + " " + s4;
    s1 += " 8 ";
    cout << s1 + s2 + "!"; */

  /* ifstream in("D:\\C++\\Thinking_in_C_plus_plus\\scopy.txt");  //otwarcie do odczytu
     ofstream out("Scopy2.txt"); //otwarcie do zapisu
    string s ;
    while(getline(in,s))
        out<<s<< "\n"; */

ifstream plik("D:\\C++\\Thinking_in_C_plus_plus\\Program_1\\scopy.txt"); //otwarcie pliku
string tymczasowa; //zapisywac bedziesz do klasy String
if(!plik.is_open())
cout <<"Nie otwarto pliku!";
cout<<"To: `"<<"scopy.txt"<<"` probuje otworzyc"<<endl;


while(getline(plik, tymczasowa)) //sczytywanie linijka w linijkê
cout << tymczasowa<< endl;
plik.close();

cout<<"To: `"<<"scopy.txt"<<"` probuje otworzyc"<<endl;


    ifstream in("D:\\C++\\Thinking_in_C_plus_plus\\Program_1\\scopy.txt");
    ofstream out("scopy3.txt");
    string s , line;
    while(getline(in,s))
        s+=line+ "\n";
    cout << s; */


    ifstream in("D:\\C++\\Thinking_in_C_plus_plus\\Program_1\\scopy.txt");
    if (!in.is_open())
    {
        cout << "Blad otwarcia pliku" << endl;
        return 0;
    }
    string temp;
    while (getline(in, temp))
    {
        in.push_back(temp);
    }



   /* vector<string> v;
    ifstream in("FillVector.cpp");
    string line;
    while(getline(in, line))
        v.push_back(line); //dodanie wiersza na koncu
        for (int i=0; i<v.size(); i++)
            cout << i << ":" << v[i]<< endl; */


    return 0;
}

 

Ogólnie uczę się działanie ofstream i ifstream.
Stworzyłem plik scopy.txt, który ma w sobie napisy i chciałbym na razie, żeby konsola wyświetlała zawartosc pliku na ekran, oraz, żeby program tworzył plik scopy3.txt, który jest kopią scopy.txt.

0

Mi Twój kod po podaniu prawidłowej ścieżki działa.

EDIT. Źle zapisujesz.

ifstream in("../temp.txt");
	ofstream out("scopy3.txt");
	string s, line;
	while (getline(in, s))
	{
		s += line + "\n";
		out << s;
	} 

Posprzątaj w tym kodzie...

Łap, program robi to co chciałeś:

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

using namespace std;

int main()
{
	vector<string>line;
	ifstream in("temp.txt");
	ofstream out("temp2.txt");
	if (!in.is_open())
	{
		cout << "Blad otwarcia pliku" << endl;
		return 0;
	}
	string temp;
	while (getline(in, temp))
	{
		line.push_back(temp);
	}
	for (auto it : line)
	{
		cout << it << endl;
		out << it << endl;
	}
	
	system("pause");

	return 0;
} 
0
  1. Zacznij czytać co pisze kompilator, ten kod nie może się skompilować, więc odpalasz nie to co widzisz zaś jakiegoś starego exe ze starych źródeł.
cout << s; */ // nie skompiluje się bo jest tu koniec komentarza który w tym miejscu to niepoprawny znak w kodzie
// Więc pisze coś w rodzaju: error: expected primary-expression before '/' token
  1. Dopóki jesteś początkujący weź zainstaluj sobie DevCpp nie będzie żadnych jazd ze ścieżkami.
  2. Dla przepisania pliku tekstowego polecam:
ifstream in("D:\\C++\\Thinking_in_C_plus_plus\\Program_1\\scopy.txt");
ofstream out("scopy3.txt");
string content;
getline(in,content,0);
out<<content;
0

Zainstalowałem Dev c++.
Mam taki kod:

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;

int main(int argc, char** argv) {
	
	
ifstream in("scopy.txt");
ofstream out("scopy3.txt");
string content;
getline(in,content);
out<<content;

	return 0;
}
 

Program nie wyświetla danych zawartych w scopy.txt, ale tworzy plik scopy3.txt, ale jest to pusty plik txt.
Zastąpiłem przy ifstream scopy.txt, na scieżkę docelową do pliku i nic to nie zmienia.

0

getline(in,content,0); - nawet skopiować nie jesteś w stanie?
Do wyświetlenia cout<<content;

Koniecznie spróbuj to: ifstream in("scopy.txt.txt"); bo podejrzewam że ukryłeś sobie rozszerzenia i nie wiesz co robisz.
Pamiętaj ukryj rozszerzenia znanych typów to nie jest opcja dla informatyków.

0

Kurczę, działa!!
Faktycznie opcja z scopy.txt.txt zadziałała malinowo :D

Kopiuje plik i wyswietla na ekranie.

Dziękuje bardzo. Teraz mogę uczyć dalej sie z książki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1