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

Wczytywanie liczb pierwszych z pliku txt

Object Storage Arubacloud
0 głosów
1,023 wizyt
pytanie zadane 22 maja 2019 w C i C++ przez Krzysztof Pasztaleni Nowicjusz (120 p.)
edycja 22 maja 2019 przez Krzysztof Pasztaleni
#include <iostream>
using namespace std;
int main ()
{
int a;
int podzielna;

cout << "podaj a: ";
cin >> a;

cout << 2 << endl;

for (int kolejna=3; kolejna<=a; kolejna++)
{
podzielna = 0;

for (int i = 2; i < kolejna; i++)
{
if (!(kolejna%i))
{
podzielna = 1;
break;
} 
}

if (!podzielna)
{
cout << kolejna << endl;
}
}
}

Jak zmienić ten kod żeby wczytywało z pliku liczby, zamiast podawać liczbę w programie

1 odpowiedź

0 głosów
odpowiedź 22 maja 2019 przez Bondrusiek Maniak (61,370 p.)

Witam,

w tym przypadku musisz tylko "podmienić" cin na pętlę, która obsługuje czytanie z pliku i stamtąd pobieramy właściwą liczbę i prowadzimy obliczenia, które już podałeś. Przykładowe rozwiązanie

#include <iostream>
#include <fstream>

int main()
{
    std::string line;
    std::ifstream myfile("numbers.txt");
    if(myfile.is_open())
    {
        while(myfile >> line)
        {
            //std::cout << line << " " << std::endl;//podglad pliku
            int a = std::stoi(line);
            //Twoj kod
            int podzielna;
            std::cout << "Nowa liczba" << std::endl; //poinformaowanie o nowej liczbie dla czytelności
            std::cout << 2 << std::endl;
            for (int kolejna=3; kolejna<=a; kolejna++)
            {
            podzielna = 0;

            for (int i = 2; i < kolejna; i++)
            {
            if (!(kolejna%i))
            {
            podzielna = 1;
            break;
            }
            }

            if (!podzielna)
            {
            std::cout << kolejna << std::endl;
            }
            }
            //nowa liczba


        }
        myfile.close();
    }


    return 0;
}

Można ten kod poprawić bo nie działa prawidłowo dla wartości mniejszych od 2 np dla jedynki. W pliku numbers.txt umieści liczby całkowite oddzielone spacją bądź nową linią.

1 2 3 4 5 6 7 8 9
10 22 23

Więcej informacji:

komentarz 22 maja 2019 przez Krzysztof Pasztaleni Nowicjusz (120 p.)
edycja 22 maja 2019 przez Krzysztof Pasztaleni
#include <iostream>
#include <fstream>
 
int main()
{
    std::string line;
    std::ifstream myfile("liczby.txt");
    if(myfile.is_open())
    {
        while(myfile >> line)
        {
            std::cout << line <<"C:\\Users\\u\\Desktop\\Ksyś pastal\\dev " << std::endl;
              if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
//.................
    }
    myfile.close();
  }

  else cout << "Nie mozna otworzyc pliku.";
  
  
			int a = std::stoi(line);
            
            int podzielna;
            std::cout << "Nowa liczba" << std::endl; 
            std::cout << 2 << std::endl;
            for (int kolejna=3; kolejna<=a; kolejna++)
            {
            podzielna = 0;
 
            for (int i = 2; i < kolejna; i++)
            {
            if (!(kolejna%i))
            {
            podzielna = 1;
            break;
            }
            }
 
            if (!podzielna)
            {
            std::cout << kolejna << std::endl;
            }
            }
            //nowa liczba
 
 
        }
        myfile.close();
    }
 
 
    return 0;
}

Przypadkowo edytowałem ten komentarz, proszę wybaczyć mi za to - myślałem że pisze nowy. Dalej nie działa :(

komentarz 22 maja 2019 przez Bondrusiek Maniak (61,370 p.)

Dobrze podałeś ścieżkę do pliku? Staraj się użyć ścieżki bezwzględnej do pliku np

C:\\Users\\Jon\\Desktop\\numbers.txt

Możesz dodać else, która wyświetli wiadomość jeśli nie udało się otworzyć pliku.

  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
//.................
    }
    myfile.close();
  }

  else cout << "Nie mozna otworzyc pliku."; 

To było w linku, który podałem w pierwszej odpowiedzi.

komentarz 22 maja 2019 przez Krzysztof Pasztaleni Nowicjusz (120 p.)
#include <iostream>
#include <fstream>
 
int main()
{
    std::string line;
    std::ifstream myfile("liczby.txt");
    if(myfile.is_open())
    {
        while(myfile >> line)
        {
            std::cout << line <<"C:\\Users\\u\\Desktop\\Ksyś pastal\\dev " << std::endl;
              if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
//.................
    }
    myfile.close();
  }

  else cout << "Nie mozna otworzyc pliku.";
  
  
			int a = std::stoi(line);
            
            int podzielna;
            std::cout << "Nowa liczba" << std::endl; 
            std::cout << 2 << std::endl;
            for (int kolejna=3; kolejna<=a; kolejna++)
            {
            podzielna = 0;
 
            for (int i = 2; i < kolejna; i++)
            {
            if (!(kolejna%i))
            {
            podzielna = 1;
            break;
            }
            }
 
            if (!podzielna)
            {
            std::cout << kolejna << std::endl;
            }
            }
            //nowa liczba
 
 
        }
        myfile.close();
    }
 
 
    return 0;
}

Mam to zrobione w ten sposób, co jest źle bo nie rozumiem? A ps. co do jedynki to nauczyciel kazał mi żeby tam była... Więc to nie jest błąd, ale dziękuję za link.

(plik txt znajduje się w tym samym folderze na użytkowniku U na pulpicie w folderze z tą nazwą) 

komentarz 22 maja 2019 przez Bondrusiek Maniak (61,370 p.)

Bardzo dużo rzeczy jest źle. Kod jest nielogiczny, błędny po prostu bez namysłu wkleiłeś kod. Użyj tego kody tylko zmień ścieżkę do Twojego pliku .txt z liczbami

#include <iostream>
#include <fstream>

int main()
{
    std::string line;
    std::ifstream myfile("numbers.txt");
    if(myfile.is_open())
    {
        while(myfile >> line)
        {
            //std::cout << line << " " << std::endl;//podglad pliku
            int a = std::stoi(line);
            //Twoj kod
            int podzielna;
            std::cout << "Nowa liczba" << std::endl; //poinformaowanie o nowej liczbie
            std::cout << 2 << std::endl;
            for (int kolejna=3; kolejna<=a; kolejna++)
            {
                podzielna = 0;

                for (int i = 2; i < kolejna; i++)
                {
                    if (!(kolejna%i))
                    {
                    podzielna = 1;
                    break;
                    }
                }

                if (!podzielna)
                {
                    std::cout << kolejna << std::endl;
                }
            }
            //nowa liczba


        }
        myfile.close();
    }
    else
    {
        std::cout << "Nie mozna otworzyc pliku.";
    }


    return 0;
}

 

komentarz 22 maja 2019 przez Krzysztof Pasztaleni Nowicjusz (120 p.)
Zrobiłem jak kazałeś, wyskakuje mi jeden błąd - 13    21  

 C:\Users\u\Desktop\Ksyś pastal\dev\BezNazwy3.cpp    [Error] 'stoi' is not a member of 'std'

- w 13 linijce kodu -       int a = std::stoi(line);
komentarz 22 maja 2019 przez Bondrusiek Maniak (61,370 p.)

Masz dość stary kompilator nie posiadający standardu C++11

https://stackoverflow.com/questions/38034197/compile-error-stoi-is-not-a-member-of-std

Zamień

int a = std::stoi(line);

na

 int a = atoi(line.c_str());

 

komentarz 22 maja 2019 przez Krzysztof Pasztaleni Nowicjusz (120 p.)
13    38    C:\Users\u\Desktop\Ksyś pastal\dev\BezNazwy3.cpp    [Error] 'atoi' was not declared in this scope

Znów to samo, po zamianie, korzystam z Dev c++ który jest obowiązkowy w mojej szkole
komentarz 22 maja 2019 przez Bondrusiek Maniak (61,370 p.)

Wpisuj sobie komentarze błędów kompilatora do wyszukiwarki. W zazwyczaj pierwszym odnośniku jest rozwiązanie problemu.

https://bytes.com/topic/c/answers/954092-whats-wrong-program

Dodaj w pierwszej linijce:

#include <cstdlib>

 

komentarz 22 maja 2019 przez j23 Mędrzec (194,920 p.)

@Krzysztof Pasztaleni,   po co Ci to atoi, skoro możesz od razu czytać liczbę?

int value;

while (myfile >> value) {
    ...
}

 

Podobne pytania

0 głosów
1 odpowiedź 844 wizyt
pytanie zadane 19 czerwca 2020 w C i C++ przez tomek.99 Początkujący (370 p.)
0 głosów
2 odpowiedzi 672 wizyt

92,570 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...