Referencja pliku

0

Witam napisałem program który rozklada liczbe w pliku na liczby pierwsze i nie wiem czy dobrze użyłem referencji pliku do zapisu.Program sie kompiluje,ale nie moge sprawdzic czy działa bo jak daje nazwy pliku txt wychodzi bład to,ze zle podany plik wejsciowy,a uruchamiam go tak,ze wchodze w cmd wklejam plik exe i podaje -o plik.txt -i plik2.txt pliki sa w folderze z exe z tym tez sie przyda mała pomoc.
Kod:

#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <cstdlib>
#include <sstream>
#include <string.h>
using namespace std;

void rozklad(int x, fstream &plikzap) // rozklad na czyyniki
{

	int k = 2;
	while (x > 1)
	{
		while (x % k == 0)
		{
			plikzap<<k;
			x /= k;
		}
		++k;
	}

}

void odczytpliku(const string &plikotwierany, fstream &plikzap)//Funkcja odczytujaca plik wejsciowy
{
	fstream plik;
	string linia;
	int z;
	plik.open(plikotwierany.c_str(), ios::in);
	if (plik.good())
	{
		while (getline(plik, linia))
		{
			z = 0;
			int x = 0;
			for (unsigned int i = 0; i < linia.length(); i++)//sprawdzanie czy to jest liczba
			{
				if (!isdigit(linia[i]))//warunek do liczby
				{
					z = 1;//zmienna okreslajaca czy to jest liczba czy nie.
				}
			}
			if (z != 1)
			{
				istringstream iss(linia);//konwersja stringu na int.
				iss >> x;
				rozklad(x, plikzap);//rozpoczecie dzia³ania.

			}
			else
			{
				const char* k = "blad wprowadzenia\n";//
				plikzap<<k;
			}
		}
	}

	cout << "zle podany plik wejsciowy"; //Plik wejsciowy jest niepoprawny
	plik.close();
}

int main(int argc, char*argv[])
{
	string plikotwierany = "";
	string plikzapisywany = "";
	if (argc == 1)
	{

		cout << "Nie podano argumentow.Podaj zrodlo i plik docelowy" << endl << "przyklad:plik.exe -o x.txt -i y.txt";
		return 0;
	}
	else
	{
		char *stringotwarcia = "-i";
		char *stringzapisu = "-o";
		for (int a = 1; a<argc; ++a)
		{

			if (!strcmp(argv[a], stringotwarcia))
			{
				plikotwierany = argv[a + 1];
			}
			else if (!strcmp(argv[a], stringzapisu))
			{
				plikzapisywany = argv[a + 1];
			}
		}
		if (plikotwierany.length() == 0)
		{
			cout << "nie podano pliku otwarcia";
			return 0;
		}
		if (plikzapisywany.length() == 0)
		{
			cout << "nie podano pliku zapisu";
			return 0;
		}

	}
	fstream plikzap;
	plikzap.open(plikzapisywany.c_str(), ios::out);
	odczytpliku(plikotwierany, plikzap);
	plikzap.close();

	return 0;
}
 
1

pokaż co wpisujesz w cmd dokładnie

0

C:\Users\Wojtek>C:\Users\Wojtek\Desktop\Asd\Projekt\main.exe -o output.txt -i input.txt

1

podając takie coś to tak samo jakbyś podawał

C:\Users\Wojtek>C:\Users\Wojtek\Desktop\Asd\Projekt\main.exe -o C:\Users\Wojtek\output.txt -i C:\Users\Wojtek\input.txt

Opcje masz takie, że podawaj pełne ścieżki czyli

C:\Users\Wojtek>C:\Users\Wojtek\Desktop\Asd\Projekt\main.exe -o C:\Users\Wojtek\Desktop\Asd\Projekt\output.txt -i C:\Users\Wojtek\Desktop\Asd\Projekt\input.txt

Albo lepiej przejdź do folderu z exe i podawaj po ludzku. Czyli

C:\Users\Wojtek>cd C:\Users\Wojtek\Desktop\Asd\Projekt
C:\Users\Wojtek\Desktop\Asd\Projekt>main.exe -o output.txt -i input.txt
0

Nie działa :/
Bez tytułu.png

1

Z przekazywaniem referencji na strumień wszystko w porządku.
Podaj swojemu programowi plik zawierający powtórzoną 100-krotnie liczbę 987654321, po czym podaj to samo do tego:

#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
 
vector<unsigned> Eratostenes(size_t max)
  {
   vector<bool> tb(++max,true);
   vector<unsigned> ret;
   for(size_t sq=4,i=2;sq<=max;sq+=i,sq+=(++i)) 
     {
      if(tb[i])
        {
         for(size_t k=i*i;k<max;k+=i) tb[k]=false;
         ret.push_back(i);
        }
     }
   return ret;
  }

void factorization(const vector<unsigned> &tb,unsigned value)
  {
   cout<<value<<" =";
   unsigned shift=2;
   for(unsigned i=0,div=tb[i];div<=value;)
     {
      unsigned next=value/div;
      if(value==next*div)
        {
         cout<<(" * "+shift)<<div;
         value=next;
         shift=0;
        }
      else if(++i<tb.size()) div=tb[i];
      else break;
     }
   if(value!=1) cout<<(" * "+shift)<<value;
  }

void proceed(ifstream &fin)
  {
   unsigned max=0,value;
   while(fin)
     {
      if(!(fin>>value)) fin.clear();
      else if(max<value) max=value;
      while((fin.get()!='\n')&&(fin)) {}
     }
   vector<unsigned> tb(Eratostenes((unsigned)sqrt(max)));
   fin.clear();
   fin.seekg(0,ios::beg);
   while(fin)
     {
      if(!(fin>>value)) fin.clear();
      else factorization(tb,value);
      for(int ch;((ch=fin.get())!='\n')&&(fin);) cout.put(ch);
      cout<<endl;
     }
  }

int main(int argc,char *argv[])
  {
   const char *opt[][2]={{"-i","test.txt"},{"-o"}};
   const size_t optsize=sizeof(opt)/sizeof(*opt);
   for(int i=1;i<argc;++i)
     {
      const char *par=argv[i];
      for(int k=0;k<optsize;++k)
        {
         int len=strlen(opt[k][0]);
         if(!strncmp(par,opt[k][0],len))
           {
            if(argv[i][len]) opt[k][1]=argv[i]+len;
            else if(++i<argc) opt[k][1]=argv[i];
            break;
           }
        }
     }
   ifstream fin(opt[0][1]); // jak nie podasz pliku do odczytu to czyta z test.txt
   if(!fin)
     {
      cerr<<"Nie udalo sie otworzyc pliku do odczytu \""<<opt[0][1]<<"\""<<endl;
      return 1;
     }
   ofstream fout;
   if(opt[1][1]) // jak nie podasz pliku do zapisu to wywala na ekran
     {
      fout.open(opt[1][1]);
      if(!fout)
        {
         cerr<<"Nie udalo sie otworzyc pliku do zapisu \""<<opt[1][1]<<"\""<<endl;
         return 2;
        }
      cout.rdbuf(fout.rdbuf());
     }   
   proceed(fin);
   return 0;
  }
0

Po wyłaczeniu dalej to samo : Bez tytułu.png

1

Bo brakuje else przed cout << "zle podany plik wejsciowy"; //Plik wejsciowy jest niepoprawny

0

Jezu,ale głupi blad dziekuje za pomoc wam :)

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