Pascal: két szövegfájl tartalmából azt szeretném megkapni, amit csak egyik vagy csak másik fájl tartalmaz. Ami mindkettőben megvan azt nem. Miként kell ezt?
Szeretném megvalósítani azt, hogy beolvasom két tömbbe F és F2 sorait, egyenként szeretném végignézni, hogy ha F2 nem tartalmazza F bizonyos sorát (és fordítva ugyanígy), akkor az egy külön harmadik fájlba kerüljön.
Beolvasás után szeretném összehasonlítani a sorokat, minden sort minden sorral és ez az ami nem megy.
F2 első sorát F2 összes sorával, F2 második sorát F összes sorával...
Kizárólag azok kerülnének kiírásra, amelyeket csak az egyik fájl tartalmaz.
Mi a módja ennek?
A string típus praktikus és jó, ha biztosan tudom, hoy a sorok nem fogják meghaladni a 255 karaktert, sőt, nagoyn rövidek, tudom hogy van ansistring amikor egyetlen stringbe befér egy egész text fájl stb...
Tömbös megvalósítását a feladatnak azért gondoltam, mert - ha jól tudom - text fájl csak szekvenciálisan kezelhető...
Segít valaki ezt befejezni?
Külön jó lenne, ha azt is kiírná a harmadik fájlba minden sor elejére, hogy melyik fájlban volt meg a kettő közül.
Program Fajlolvas;
var
f,f2, harmadik : Text;
s : String;
f1t, f2t : Array [0..1000] of String;
sorsz : Word;
begin
Assign (f, paramstr ( 1 ) );
Assign (f2, paramstr ( 2 ) );
Assign(harmadik, paramstr (3 ) );
Reset (f);
Reset (f2);
Reset (harmadik);
sorsz := 0;
While Not Eof (f) Do
begin
ReadLn (f, s);
f1t[sorsz] := s;
Inc (sorsz);
end;
sorsz := 0;
While Not Eof (f2) Do
begin
ReadLn (f2, s);
f2t [sorsz] := s;
Inc (sorsz);
end;
Close (f);
Close (f2);
Close(harmadik);
end.
Semmi sem bonyolult ha ráérez az ember :) Kicsit átláthatóbban az előző maszlag:
class Text
{
std::string m_text;
mutable std::vector<std::pair<std::string, size_t>> m_fileCount;
public:
explicit Text(const std::string &text) : m_text{text} {}
Text(const std::string &text, const std::string &fileName) : m_text{text} { m_fileCount.emplace_back(fileName, 1); }
~Text() {}
friend bool operator<(const Text &lhs, const Text &rhs);
void Increment(const std::string &fileName) const
{
auto found = std::find_if(m_fileCount.begin(), m_fileCount.end(), [&](const auto &i)
{
if(i.first == fileName)
return true;
return false;
});
if(found == m_fileCount.end())
m_fileCount.emplace_back(fileName, 1);
else
++found->second;
}
std::string GetText() const noexcept { return m_text; }
auto GetData() const noexcept { return m_fileCount; }
};
bool operator<(const Text &lhs, const Text &rhs)
{
return lhs.m_text < rhs.m_text;
}
int main(int argc, char *argv[])
{
std::locale::global(std::locale{"HU"});
std::vector<std::string> file = {"file1.txt", "file2.txt"};
std::set<Text> set;
for(size_t i = 0; i < file.size(); ++i)
{
std::ifstream ist{file[i]};
if(!ist) throw std::exception{"File doesn't exist!"};
for(std::string s; ist >> s;)
{
auto found = set.find(Text{s});
if(found == set.end())
set.insert(Text{s, file[i]});
else
found->Increment(file[i]);
}
}
for (const auto &i : set)
{
std::cout << i.GetText() << ":\n";
for (const auto &k : i.GetData())
std::cout << '\t' << k.first << " | " << k.second << '\n';
}
std::cin.get();
return 0;
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!