Jak otevřít soubor v C++ a nahradit řetězce po řádku? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak otevřít soubor v C++ a nahradit řetězce po řádku? – C / C++ – Fórum – Programujte.comJak otevřít soubor v C++ a nahradit řetězce po řádku? – C / C++ – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín

Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
oxidián0
Expert
19. 8. 2017   #1
-
0
-

   

// reading a text file
#include <iostream>
#include <fstream>
#include <string>
#include <dirent.h>
using namespace std;

int main () {
  string line;

    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir ("U:\\C\\DIR\\TXT")) != NULL) {
      while ((ent = readdir (dir)) != NULL) {
        printf ("%s\n", ent->d_name);
        ifstream ifs( ent->d_name );
        ifs.open (ent->d_name, std::ifstream::in);
        if (ifs.is_open())
          {
            while ( ifs.good() )
            {
              getline (ifs, line);
              cout << line << endl;
            }
            ifs.close();
          }
        else cout << "Unable to open file\n";



      } // end while
      closedir (dir);
    } else {
       perror ("File open failed");
      return 0;
    }


  return 0;
}


Můžete mi říct proč se mi nedaří otevřít soubor? Se souborem chci provést nahrazování po řádcích.

Soubory typu txt, kódování WINDOWS-1250, obsahují české znaky

Např.

A) pokud řádek obsahuje string (hledání pomocí regulárního výrazu), pak ho pak přidej <stroke>...text řádku..</stroke>

nebo

B) odstraň řádek

nebo

C) nahraď určité slova za jiné slova. Např. Motor\w*, Auto\w* nahraď za stroj. Nebo Motorka nahraď za Motocykl apod.

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
439 příspěvků
19. 8. 2017   #2
-
0
-

Pokud nejsi v tom adresáři, který čteš, tak při před název souboru musíš přidat cestu.

Ten soubor otevíráš dvakrát (konstruktor a open), takže se nastaví failbit a neprojde good.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
439 příspěvků
19. 8. 2017   #3
-
0
-

Vyhoď ten open, ten konstruktor to otevře.

Nebo použij konstruktor bez parametru a otevře to až open.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
439 příspěvků
19. 8. 2017   #4
-
0
-

K tomu dalšímu -- C++ umí regulární výrazy až od C++11, pro starší verze budeš potřebovat externí knihovnu.

Pro to nahrazování budeš muset načíst celý obsah souboru do paměti a po úpravách ho zase celý zapsat, nebo postupně z jednoho souboru číst a do jiného zapisovat. (Kdybys to chtěl dělat postupně nad jedním souborem, tak bys musel různě posunovat následující data a to by bylo na zbláznění.)

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
439 příspěvků
19. 8. 2017   #5
-
+1
-
Zajímavé

Nemaž příspěvky. Vypadám, že se bavím sám se sebou :D

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Expert
19. 8. 2017   #6
-
0
-

Mám převést zdroj programu na Windows-1250?

// reading a text file
#include <iostream>
#include <fstream>
#include <string>
#include <dirent.h>
using namespace std;

int main () {
  string line;
  std::string path = "U:\\C\\DIR\\txt";
  DIR *dir;
  struct dirent *ent;

  if ((dir = opendir (path.c_str() )) != NULL) {
      while ((ent = readdir (dir)) != NULL) {
        printf ("%s\n", ent->d_name);
        std::string tmp = path + "\\" + ent->d_name;
        ifstream ifs( tmp.c_str() );
        if (ifs.is_open())
          {
            while ( ifs.good() )
            {
              getline (ifs, line);
              cout << line << endl;
            }
            ifs.close();
          }
        else cout << "Unable to open file\n";
      } // end while
      closedir (dir);
    } else {
       perror ("File open failed");
      return 0;
    }


  return 0;
}

Ono to furt odebírá zpětné lomítka

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Expert
19. 8. 2017   #7
-
0
-

Druhá možnost, ale zdá se že jede mnohem pomaleji než ten první, kde jsem pracoval po řádcích:

// reading a text file
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <dirent.h>
using namespace std;

int main () {
  std::string line;
  std::stringstream stream;
  std::string content;
  std::string path = "U:\\C\\NBK\\txt";
  DIR *dir;
  struct dirent *ent;

  if ((dir = opendir (path.c_str() )) != NULL) {
      while ((ent = readdir (dir)) != NULL) {
        printf ("%s\n", ent->d_name);
        std::string tmp = path + "\\" + ent->d_name;
        ifstream ifs( tmp.c_str() );
        if (ifs.is_open())
          {
            /*
            while ( ifs.good() ) {
              getline (ifs, line);
              cout << line << endl;
            } */
            stream << ifs.rdbuf();//read the file
            std::string content = stream.str(); //str holds the content of the file
            ifs.close();
            std::cout << content << std::endl;
          }
        else cout << "Unable to open file\n";
      } // end while
      closedir (dir);
    } else {
       perror ("File open failed");
      return 0;
    }


  return 0;
}
Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Expert
19. 8. 2017   #8
-
0
-

verze stringstream jede 9x pomaleji

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Expert
19. 8. 2017   #9
-
0
-

#4 gna

To není možný že by to nešlo jednoduše po řádkách. Ten soubor se přece může zapsat jako nový do jiného adresáře.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Expert
19. 8. 2017   #10
-
0
-

Nevím čím to je, ale pořád mi to krachuje.

          std::string line;
          while ( ifs.good() )
             {
             getline (ifs, line);
             if ( line.length() == 0) {
                 c++;
                 cStr << c;
                 line = line + "<h3>"  + cStr.str() + "<h3>";
                 }

             std::cout << line << std::endl;

             // 1.
             boost::replace_all(line, "abc", "hij");
             boost::replace_all(line, "def", "klm");

             // 2.
             line = boost::replace_all_copy (
             boost::replace_all_copy<string>
                  ("abc def abc def", "abc", "hij")
                  ,  "def"
                  ,  "klm"
                );

              } // end while


Snažím se o to, že pokud je řádek prázdný, chci změnit řádek na nadpis s číslem prázdného řádku.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Expert
19. 8. 2017   #11
-
0
-

#10 oxidián
Chybu jsem odstranil a teď se snažím přijít na to jak udělat toto:

found = line.find(':',3);

potřebuju vrátit řetězec, který začíná za dvojtečkou a končí před mezerou

např:101 // tady je už koment
Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
439 příspěvků
20. 8. 2017   #12
-
0
-

   

size_t beg = neco.find(':', 3);
size_t end = (beg != string::npos) ? neco.find(' ', beg + 1) : string::npos;
if (beg != string::npos && end != string::npos)
	string sub = neco.substr(beg + 1, end - beg - 1);
Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Expert
20. 8. 2017   #13
-
0
-

Jo, dík, ale už to mám hotové. Tedy udělal jsem to trochu jinak, ale i tak se tvůj kód bude hodit v budoucnu.

Nahlásit jako SPAM
IP: 78.102.61.–
Doomista+1
Stálý člen
22. 8. 2017   #14
-
0
-

Lehce offtopic - vždy v cestách používej pouze normální lomítka. Bude to fungovat univerzálně na všech platformách.

Nahlásit jako SPAM
IP: 2001:67c:1220:809::93e5:9...–
Na vše stačí iostream...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 67 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý