Porównywanie zawartości pliku
Mariusz: Ktoś z was bawił się programowaniem ?
Mamy dane dwa pliki
Porównując n początkowych znaków w linii w obydwu plikach
wypisać te linie których w jednym z plików brakuje
Jeśli pliki mają tę samą liczbę linii to wypisać odpowiedni komunikat
Próbowałem w podwójnie zagnieżdżonej pętli sprawdzać czy dla wybranej linii
z tego większego pliku istnieje linia w tym mniejszym pliku mająca n pierwszych znaków równych
Tę linię która nie miałaby pary chciałem wypisać
Nie uzyskałem jednak oczekiwanych rezultatów
16 wrz 13:50
jakubs: Wrzuć kod.
16 wrz 13:55
Mariusz: Gdyby kod działał to bym nie pisał
16 wrz 14:48
jakubs: Gdzieś zgubiłem swoją magiczną rózgę, więc niestety nie pomogę.
16 wrz 14:50
Mariusz:
Jak napisać taki program od początku ?
Może inny pomysł byłby lepszy
Gdybyś zobaczył kod też byś nie pomógł
Inny dzieciak też gdy zobaczył tekst to mu się odechciało go tłumaczyć
chociaż to nieco więcej niż strona tekstu była
16 wrz 15:04
jakubs: Zależy w jakim języku, np. w C++ można skorzystać ze stringów i porównywanie będzie dziecinnie
proste
16 wrz 15:07
Braun:
@Mariusz Ty jesteś studentem, że tak zapytam ?
16 wrz 15:23
Joe Black: Mariusz z postem o 15:04 twoje nastawienie jest takie: Dajcie gotowy kod.
16 wrz 16:01
Dziadek Mróz:
Uje muje, dzikie węże.
Po primo, jaki język.
Po secundo, dej mie kod!
Po tertio, wyrażaj się.
16 wrz 17:39
Braun:
Po quattro to samo co po primo, secundo i tertio
16 wrz 17:51
Mariusz:
Myślę że wiem dlaczego kod mi nie działa a ten temat pokazuje to jaka jest wasza "pomoc"
16 wrz 18:12
Braun:
@Mariusz jeśli byś wstawił kod, to gwarantuję, że otrzymałbyś pomoc !
16 wrz 18:17
Mariusz:
jakubs no właśnie najlepiej skorzystać z łańcuchów tylko że oprócz tego trzeba by przypomnieć
sobie co nieco o odczycie plików
Myślałem też nad wczytaniem zawartości plików do jakiejś struktury danych jak np lista
ale chyba jest to niepotrzebna komplikacja
16 wrz 18:18
16 wrz 18:25
Mariusz:
Gdy odszedłem na trochę od komputera i trochę pomyślałem nad kodem
to doszedłem do tego czego zabrakło w kodzie
Pisałem o tej zagnieżdżonej pętli otóż wydaje mi się że w napisanym kodzie
wewnętrzna pętla wykonuje się tylko raz
Kiedy pojawia się błąd Segmentation Fault ?
Parę razy podczas pisania kodu mi się pojawił
16 wrz 18:48
Dziadek Mróz:
To znaczy, że odwołujesz się do nieistniejących danych, np. do znaków w tablicy poza jej
zakresem.
Wyjaśnij jeszcze raz co chcesz zrobić.
Masz dwa pliki A i B, wczytujesz z każdego po linii i sprawdzasz n znaków w każdej, jak coś nie
pasuje lub ilość linii jest inna to dajesz komunikat?
16 wrz 19:02
Dziadek Mróz:
Jeżeli bawisz się na tablicach znaków to używaj
<cstring>, jeżeli chcesz aby wszystko się
automatycznie załatwiało to używaj
<string> i zdefiniowanej w niej klasy
string.
Info na stronie
http://www.cplusplus.com/reference/string/
16 wrz 19:05
Dziadek Mróz:
Pochwal się kodem jaki spłodziłeś. Co Ci szkodzi
16 wrz 19:42
Mariusz:
W javie napisałem bo tam jest klasa java.util.LinkedList która ma odpowiednie metody
Problem jest z wyświetlaniem znaków
(np Hiszpanie mają tyldę i akcent graficzny które to nie wyświetlają się poprawnie ,
Niemcy mają ostre s, oraz przegłosy, które także nie wyświetlają się poprawnie)
W C++ mnie się nie udało ale znalazłem podobne zadanie i tam jeden dał gotowy kod
Dziadek jeśli ci nie przeszkadza brak formatowania kodu to mogę przesłać moją
próbę napisania w C++
(Brak formatowania kodu jest błędem w Pythonie)
Ciekawy jestem jak napisać bez korzystania ze struktur danych (jedynie na plikach i łańcuchach)
(Mimo ustawienia wskaźnika pliku na początek po przejściu wewnętrznej pętli nie uzyskałem
oczekiwanych rezultatów)
Na razie podam w Javie abyś zobaczył dlaczego znaki się nie wyświetlają poprawnie
[code]
package missingLines;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
import java.util.LinkedList;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non−commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class NewJFrame extends javax.swing.JFrame {
private JButton jButton1;
private JTextField jTextField2;
private JLabel jLabel2;
private JTextField jTextField1;
private JLabel jLabel1;
private JScrollPane jScrollPane1;
private JTextArea jTextArea1;
/**
* Auto−generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
NewJFrame inst = new NewJFrame();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public NewJFrame() {
super();
initGUI();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE
ON
CLOSE);
getContentPane().setLayout(null);
{
jButton1 = new JButton();
getContentPane().add(jButton1);
jButton1.setText("Znajdź");
jButton1.setBounds(219, 434, 135, 21);
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
}
{
jScrollPane1 = new JScrollPane();
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(75, 153, 445, 260);
{
jTextArea1 = new JTextArea();
jScrollPane1.setViewportView(jTextArea1);
jTextArea1.setBounds(140, 251, 344, 153);
}
}
{
jLabel1 = new JLabel();
getContentPane().add(jLabel1);
jLabel1.setText("\u015acie\u017cka do pliku 1");
jLabel1.setBounds(122, 47, 103, 14);
}
{
jTextField1 = new JTextField();
getContentPane().add(jTextField1);
jTextField1.setBounds(257, 44, 143, 21);
jTextField1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jTextField1ActionPerformed(evt);
}
});
}
{
jLabel2 = new JLabel();
getContentPane().add(jLabel2);
jLabel2.setText("\u015acie\u017cka do pliku 2");
jLabel2.setBounds(122, 98, 103, 14);
}
{
jTextField2 = new JTextField();
getContentPane().add(jTextField2);
jTextField2.setBounds(257, 95, 143, 21);
jTextField2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jTextField2ActionPerformed(evt);
}
});
}
pack();
this.setSize(636, 573);
setTitle("Brakujące linie w pliku");
} catch (Exception e) {
e.printStackTrace();
}
}
private void jButton1ActionPerformed(ActionEvent evt) {
System.out.println("jButton1.actionPerformed, event="+evt);
//TODO add your code for jButton1.actionPerformed
String fragment=new String();
LinkedList<String> l1=new LinkedList<String>();
LinkedList<String> l2=new LinkedList<String>();
try {
FileReader fr = new FileReader(sciezka1);
BufferedReader br = new BufferedReader(fr);
String line=new String();
while ((line = br.readLine()) != null) {
System.out.println(line);
fragment=line.substring(0, line.indexOf("(")−1);
l1.addLast(fragment);
}
fr.close();
} catch (FileNotFoundException e) {
// TODO Auto−generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto−generated catch block
e.printStackTrace();
}
try {
FileReader fr = new FileReader(sciezka2);
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
fragment=line.substring(0, line.indexOf("(")−1);
l2.addLast(fragment);
}
fr.close();
} catch (FileNotFoundException e) {
// TODO Auto−generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto−generated catch block
e.printStackTrace();
}
for(int index=0;index<l2.size();index++){
fragment=l2.get(index);
while(l1.contains(fragment)) l1.remove(fragment);
}
for(int index=0;index<l1.size();index++){
fragment=l1.get(index);
jTextArea1.append(fragment);
jTextArea1.append("\n");
}
}
String sciezka1=new
String("C
workspace/MissingLinesInFile/src/missingLines/sebastianrulli.doc");
String sciezka2=new
String("C
workspace/MissingLinesInFile/src/missingLines/anacontreras.doc");
private void jTextField1ActionPerformed(ActionEvent evt) {
System.out.println("jTextField1.actionPerformed, event="+evt);
//TODO add your code for jTextField1.actionPerformed
sciezka1=jTextField1.getText();
}
private void jTextField2ActionPerformed(ActionEvent evt) {
System.out.println("jTextField2.actionPerformed, event="+evt);
//TODO add your code for jTextField2.actionPerformed
sciezka2=jTextField2.getText();
}
}
[/code]
Część graficzną wyklikałem sobie używając Jigloo
W eclipsie znaki wyświetlane są poprawnie bo pogrzebałem w ustawieniach
ale po wyeksportowaniu do .jar już tak ładnie nie jest
Poza tym nie zawsze wypisuje poprawne linie
19 wrz 13:12
Mariusz:
Wyjaśnij jeszcze raz co chcesz zrobić.
Oto treść podobnego zadania tyle że ja zadowoliłbym się porównywaniem fragmentów linii
Witam, mam do napisania program który pobiera dane z dwóch plików tekstowych A i B
a następnie czyta kolejne linie z pliku B i sprawdza czy są w pliku A,
jeśli NIE, dopisuje je do pliku tekstowego C.
19 wrz 13:46
19 wrz 16:43
Dziadek Mróz:
W C++ LinkedList jest zdefiniowane pod <vector> (jednokierunkowa) lub
(dwukierunkowa).
19 wrz 18:05
Dziadek Mróz:
< list > zamiast tej emotki, bez spacji między <>
19 wrz 18:06
Mariusz:
http://pastebin.com/8ZDQ713j
Dziadek chciałeś kod to masz kod tyle że nie działa
Tak jak wcześniej wspomniałem Segmentation Fault się pojawia
Lepiej wczytać zawartość pliku do jakiejś struktury danych
czy czytać plik i zapisywać linie do łańcucha ?
19 wrz 23:36
Dziadek Mróz:
Dodaj jeszcze te dwa pliki tekstowe, żebym wiedział na jakich danych operujesz
20 wrz 11:24
Dziadek Mróz:
Problem jest w linii:
dlugosc = strlen(linia1) −
strlen(strstr(linia1, "("));
Pomyśl trochę co jest źle
Wskazówka: poczytaj manual do strlen i strstr.
20 wrz 11:52
Dziadek Mróz:
I jeżeli chcesz porównać zawartość plików to nie szukaj podwójnymi pętlami, bo jeżeli jeden
plik zaczyna się inaczej niż drugi to nie są takie same
20 wrz 11:58
20 wrz 12:03
20 wrz 12:06
Mariusz:
...nie szukaj podwójnymi pętlami
A jak chcesz sprawdzać czy dowolna linia z jednego pliku
znajduje się także w drugim pliku
Znalazłem podobne zadanie i tam koleś też sprawdza linie w podwójnej pętli
tylko jeden plik wczytuje do wektora
20 wrz 12:17
Dziadek Mróz:
Napisz na GG: 1431298
20 wrz 13:36
Mariusz:
Rzeczywiście jak zakomentowałem tę linię i przypisałem wartość zmiennej długość
to błąd nie wystąpił jednak programik nie wyświetlał tego co powinien
strlen przyjmuje jako argument łańcuch a zwraca liczbę całkowitą
strstr zwraca wskaźnik na pierwsze wystąpienie łańcucha 2 w łańcuchu 1
Gdy wpisałem
printf("%s\n",strstr(linia1,"("));
to wydukowało fragment łańcucha od znaku '(' do znaku końca łańcucha
20 wrz 13:48
przemek ania: co tam pisz do mnie ok
21 wrz 17:03
Dziadek Mróz:
Już wyjaśnione, źle skonstruowany algorytm i brak alokacji pamięci wysypywał program.
21 wrz 17:40
Mariusz:
W Pascalu nie ma swobodnego dostępu do plików tekstowych (procedura seek nie działa)
więc aby powtórnie przeczytać plik trzeba go zamknąć i ponownie otworzyć
a to nie jest dobre rozwiązanie dlatego przydałby się moduł do obsługi listy
8 paź 01:48
Mariusz:
Co do braku alokacji pamięci to ona rzeczywiście mogła wysypywać program
ale algorytm był dobry (czytanie pliku musiało być w podwójnej pętli )
tyle że za dużo czyta z pliku ale aby to poprawić przydałaby się lista
której дедушка мороз już "nie wyjaśnił "
więc nie napisałbym że wyjaśnione
Oczywiście ta poprawka z listą działałaby dla małych plików których zawartość
mieści się w pamięci
Pomysł z posortowaniem można zrealizować z użyciem pliku wsadowego
(komenda copy oraz sort)
Pisał ktoś z was takie pliki ?
21 lut 19:40