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

C++: Jak odczytać tylko część linii z pliku .txt?

VPS Starter Arubacloud
–1 głos
486 wizyt
pytanie zadane 20 sierpnia 2020 w C i C++ przez Drożdżówka Obywatel (1,870 p.)

Witam!

Mam następujące pytanie, jak sprawić żeby program odczytywał np. tylko pięć liter z linii pliku .txt, a następnie zapisywał je do zmiennej x?

Oto dokładniejszy przykład:

PLIK.txt
   ==============
   =
   =
   =
   =
   ==============
   ^
    \--------------------------------------------\
   Program teraz zapisuje do zmiennej Postion[1] ten znak.

Z góry dziękuję za pomoc!

komentarz 20 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Wczytujesz całą linię i wyodrębniasz wybrane znaki.
komentarz 20 sierpnia 2020 przez Drożdżówka Obywatel (1,870 p.)
Ale jak to zrobić?

3 odpowiedzi

0 głosów
odpowiedź 20 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)
wybrane 20 sierpnia 2020 przez Drożdżówka
 
Najlepsza

Kod pisany od ręki srki

#include <iostream>
#include <Windows.h>
#include <cstdio>
using namespace std;

int main()
{
  string NazwaPliku = "test.txt";


   //Odczytanie danej lini
fstream Odczyt;
string Int;//Zmienne do której zapisujemy wszystko;
Odczyt.open(NazwaPliku);
for (int =0;i<5;i++) // 5 nr lini który chcemy odczytać
{
getline(Odczyt,Int);}
//Teraz bierzemy ten odczytany fragment i przycinamy go do 5 znaku 
char buf[128]; // bufor dla 5 znakow
for (int i =0;i<5;i++)
{
buf[i] = Int[i];
}


//i teraz łączymy całość

char CalyWyraz[128];
sprintf(CalyWyraz,"%s",buf);
}

Ps. wiem że są jakieś tam funkcjee od string'a ale jakoś rzadko używam stringa wolę char'a

komentarz 21 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

Można wiedzieć, po co ten cyrk z tymi tablicami (szczególnie CalyWyraz)?

W linii 19 jest błąd. Powinieneś wyzerować tablicę, bo nie masz gwarancji, że po 5 znakach będzie zero.

komentarz 21 sierpnia 2020 przez Official gildin Bywalec (2,820 p.)

Czytaj wszystko co? 

 

Kod pisany od ręki srki

 

Jak Ci nie pasuje, to nie czytaj kodu, proste 

1
komentarz 21 sierpnia 2020 przez j23 Mędrzec (194,920 p.)

To, że pisany od ręki, OK - sam tak piszę, błędy się zdarzają. Wskazałem Ci jeden. Ale te dziwactwa z tablicami to nie jest wynik pisania od ręki. Stąd moje pytanie: po co?

Jak Ci nie pasuje, to nie czytaj kodu, proste 

To jest forum publiczne i wszystko, co tu napiszesz, podlega ocenie. Deal with it ;)

1
komentarz 22 sierpnia 2020 przez Patrycjerz Mędrzec (192,340 p.)
j23, słowo "cyrk" powoduje, że twój komentarz brzmi jak atak, a nie jak konstruktywna krytyka. Proszę na przyszłość bardziej zważać na słowa.
0 głosów
odpowiedź 21 sierpnia 2020 przez VBService Ekspert (251,170 p.)

@tkz,
Wczytujesz całą linię i wyodrębniasz wybrane znaki.

@Mati49,
Ale jak to zrobić?

Najpierw wczytujesz, linie z której chcesz wyodrębnić 5 znaków

Getting the nth line of a text file in C++

std::string ReadNthLine(const std::string& filename, int N)
{
   std::ifstream in(filename.c_str());

   std::string s;
   //for performance
   s.reserve(some_reasonable_max_line_length);    

   //skip N lines
   for(int i = 0; i < N; ++i)
       std::getline(in, s);

   std::getline(in,s);
   return s; 
}

Potem "pobierasz" 5 znaków z wyodrębnionej linii

char* vs std:string vs char[] in C++  -->  2. Using std::string

// substring of string s1
// substr(pos, length_of_substring)
   string sub = s1.substr(0, 5);
   cout << sub << endl; // Hello

 

komentarz 21 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

Rzutowanie nazwy pliku na C-array w konstruktorze ifstream'a jest zbędne. 

https://stackoverflow.com/questions/5207550/in-c-is-there-a-way-to-go-to-a-specific-line-in-a-text-file
Ten sposób powinien być nieco lepszy ze względu na nie-zapisywanie wyników pobierania poprzednich linii. 

Jeszcze taka uwaga co do tego zapisu. 

//for performance
   s.reserve(some_reasonable_max_line_length);

Jeżeli string będzie mniejszy niż 16(tutaj nie jestem pewny, oraz jest to chyba zależne od implementacji, ponieważ spotkałem się również z 24) znaków, to nic nie ugramy. Więc, czy tak bardzo "performance", to powątpiewam. 

–1 głos
odpowiedź 22 sierpnia 2020 przez VBService Ekspert (251,170 p.)
edycja 22 sierpnia 2020 przez VBService

Propozycja wink

plik.txt

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

std::string GetDataFromLine(std::string file_name,
                            unsigned int line_num,
                            unsigned int pos, unsigned int length)
{
  std::fstream file(file_name);
  file.seekg(std::ios::beg);
  for(int i=0; i < line_num - 1; ++i){
      file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
  }

  std::string output;
  std::getline(file, output);
  file.close();

  output = output.substr(pos - 1, length);
  return output;
}

int main()
{
  const std::string FILE_NAME = "plik.txt";

  std::cout << "\n";
  
  std::string output;
  std::fstream file(FILE_NAME);
  if (file.good())
  {
    while(std::getline(file, output))
    {
      std::cout << output << "\n";
    }
  }
  file.close();
  
  output = "";
  std::cout << "\n";

  std::string x, Postion[2];
  x = GetDataFromLine(FILE_NAME, 6, 1, 5);
  Postion[1] = GetDataFromLine(FILE_NAME, 6, 1, 1);
  std::cout << x << "\n" << Postion[1] << std::endl;
  return 0;
}

...program odczytywał np. tylko pięć liter z linii pliku .txt, a następnie zapisywał je do zmiennej x ...

x = GetDataFromLine(FILE_NAME, 6, 1, 5);

PLIK.txt

   ==============

   =

   =

   =

   =

   ==============

   ^

    \--------------------------------------------\

   Program teraz zapisuje do zmiennej Postion[1] ten znak.

Postion[1] = GetDataFromLine(FILE_NAME, 6, 1, 1);

 

Podobne pytania

0 głosów
1 odpowiedź 775 wizyt
0 głosów
1 odpowiedź 547 wizyt
pytanie zadane 30 lipca 2020 w PHP przez Bakkit Dyskutant (7,600 p.)
0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 9 kwietnia 2020 w Grafika i multimedia przez niko_m Użytkownik (510 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...