• 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?

Fiszki IT
Fiszki IT
–1 głos
172 wizyt
pytanie zadane 20 sierpnia 2020 w C i C++ przez Mati49 Obywatel (1,830 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 (39,540 p.)
Wczytujesz całą linię i wyodrębniasz wybrane znaki.
komentarz 20 sierpnia 2020 przez Mati49 Obywatel (1,830 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 Mati49
 
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 (164,180 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 (164,180 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,040 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 VIP (121,400 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 (39,540 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 VIP (121,400 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ź 141 wizyt
pytanie zadane 29 listopada 2020 w C i C++ przez Julka_99 Początkujący (460 p.)
0 głosów
1 odpowiedź 107 wizyt
pytanie zadane 30 lipca 2020 w PHP przez Bakkit Mądrala (6,610 p.)
0 głosów
1 odpowiedź 102 wizyt
pytanie zadane 9 kwietnia 2020 w Grafika i multimedia przez niko_m Użytkownik (510 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

84,751 zapytań

133,554 odpowiedzi

295,978 komentarzy

56,010 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...