[C] Zapis, odczyt z pliku do pliku

zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: zdzicho0 »

Pisze program chodzi tutaj o to, że wczytuje z pliku w którym jest powiedzmy kilka kolumn i ileś tam wierszy z liczbami. Chcę je wczytać do tablicy, obliczyć dla nich sinus, potem zapisać sobie już te obliczone sinusy do pliku w liczbie kolumn, którą podaje jako parametr wejściowy.

Moje wypociny: ( proszę o poprawki i uwagi )

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <math.h>       


#define PI 3.14159265

using namespace std;

int main(int argc, char *argv[])
{
    int j, i, x, y = 0;
    int liczbaKolumn = atoi(argv[1]);

    int rozmiar_pliku=0;
    
    FILE *plik;
	plik= fopen("C:\liczby.txt","r");    

    while (feof(plik)==0)
    {
          fscanf(plik, "%f ");
          rozmiar_pliku++;
          cout << "krok 3" << endl;
    }

    double* liczby = new double[rozmiar_pliku];
    
    while (feof(plik)==0)
    {
          fscanf(plik, "%d ", &liczby[i]);
          i++;
    }

    for(j=0;j<i;j++)
    {
           liczby[j] = sin(liczby[j]*PI/180), "%g.5";
           j++;
    }
    
    FILE *plik2 = fopen("C:\sinusy.txt", "w");
    
    for(x=0; x<i; x++)
    {
           if(liczbaKolumn == 3)
           {
                 fprintf(plik2, "
");
                 liczbaKolumn = 0;
           }
           
           fprintf(plik2, "%d ", liczby[x]);
           liczbaKolumn++;
           x++;
    }
    
    fclose(plik2);         
    
    return 0;
}

Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: vpprof »

Co konkretnie ci nie działa? Bo to zadanie można zrobić na wiele sposobów (zależnie też od tego, co zdefiniujemy jako kolumnę, czy kolumny są rozdzielone spacjami, jakimś innym znakiem, jaki jest format pliku etc. etc.), trudno się wczytywać w kod, nie znając szczegółów.

-- 12 paź 2013, o 17:59 --

A rozmiar pliku zwraca następujące wywołanie fseek(plik,0,SEEK_END).-- 12 paź 2013, o 18:01 --To przesuwa wskaźnik na koniec pliku, następnie wystarczy zczytać wartość wskaźnika rozmiar_pliku=ftell(plik);
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: zdzicho0 »

Kolumny rozdzielone spacjami.

Plik powiedzmy taki zwykły txt:

0,573 0,789 3,586
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593

Chciałbym żeby wynikowy był taki sami tyle samo miejsc po przecinku, czyli kolumny równe, tylko zamiast tych liczb ma być obliczony sinus z nich.

Wiem na poczatku ze progarm zapetla sie tam, gdzie jest wypisywanie krok 3.
Gouranga
Użytkownik
Użytkownik
Posty: 1590
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: Gouranga »

A po co się bawisz w tablice i cały ten bałagan?

Kod: Zaznacz cały

#include <stdio.h>
#include <math.h>
#define PI 3.14159265

int main(int argc, char **argv){
  int col = atoi(argv[1]);
  int i;
  double a;
  FILE *fi = fopen("C:liczby.txt","r");
  FILE *fo = fopen("C:wynik.txt","w");
  while (!feof(fi)){
    for (i=0; i<col; i++){
      fscanf(fi, "%lf", &a);
      fprintf(fo, "%lf ",sin(a*PI/180));
    }
  fprintf(fo, "
");
  }
fclose(fi);
fclose(fo);
return 0;
}
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: zdzicho0 »

Tylko coś tutaj jest nie tak, bo nie kończy swojego działania a program cały czas zwiększa swój rozmiar, ale pomysł super.
Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: vpprof »

zdzicho0 pisze:

Kod: Zaznacz cały

    while (feof(plik)==0)
    {
          fscanf(plik, "%f ");
          rozmiar_pliku++;
          cout << "krok 3" << endl;
    }
Zamiast wypisywać cały czas "krok 3", spróbuj umieścić to co zczytuje fscanf w jakiejś zmiennej i wypisuj tę zmienną, wtedy zobaczysz, gdzie się zapętla. Strzelam, że wypisze wszystkie liczby i zapętli się przy ostatniej, mam w pamięci podobny przypadek. Może to dlatego, że otwierasz plik jako tekstowy (nie binarny) i nie masz na końcu znaku końca pliku 0x1A (→)?
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: zdzicho0 »

Do sposobu Gouranga, bo jest dużo lepszy od mojego:

Przy pliku:
0,573 0,789 3,586
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593
9,734 9,589 6,593

Wynik:
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
0.000000 0.000000 0.000000
...

i wypełnia plik takimi liczbami w nieskończoność (nie kończy wpisywania zer)... Nie mogę odkryć błędu w kodzie
Gouranga
Użytkownik
Użytkownik
Posty: 1590
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: Gouranga »

Bo nie masz błędu w kodzie tylko w pliku wejściowym. Przyjrzyj się uważnie czym się różnią liczby na wejściu i wyjściu, drobny detal a ma ogromne znaczenie

jakbyś chciał parsować liczbę zmiennoprzecinkową z przecinkiem zamiast kropki musiałbyś osobno wczytać część całkowitą i ułamkową, przepisać to do stringa z kropką (coś w stylu sprintf(liczba, "%i.%i", a,b); ) i dalej taki string sparsować do double, nie wiem czy jest jakiś gotowy parser, do intów masz atoi()
Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: vpprof »

No tak, Gouranga ma rację, ja to przeoczyłem, standardowe funkcje takie jak scanf używają kropki jako separatora dziesiętnego, zmień w pliku wejściowym przecinki na kropki i odpisz czy działa!
zdzicho0
Użytkownik
Użytkownik
Posty: 157
Rejestracja: 15 paź 2011, o 22:45
Płeć: Mężczyzna
Lokalizacja: ...
Podziękował: 9 razy

[C] Zapis, odczyt z pliku do pliku

Post autor: zdzicho0 »

Też przeoczyłem Super rozwiązanie, dzięki za pomoc.
ODPOWIEDZ