C# Dosyaya Yazma

RamonMotta

Kilopat
Katılım
2 Ağustos 2014
Mesajlar
263
Makaleler
1
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar merhaba, elimde hali hazırda sadece bir değer girilerek yapılan bir yazılım var kendim yazdığım. Ancak ben şunu yapmak istiyorum 20-50 arası tüm değerlerin girilmesiyle oluşturulmuş sonuçları dosyaya yazmak istiyorum bunu nasıl yapabilirim?
 
Arkadaşlar merhaba, elimde halihazırda sadece bir değer girilerek yapılan bir yazılım var kendim yazdığım. Ancak ben şunu yapmak istiyorum 20-50 arası tüm değerlerin girilmesiyle oluşturulmuş sonuçları dosyaya yazmak istiyorum bunu nasıl yapabilirim?

Anlayamadim. Daha duzgun anlatin.
 
Arkadaşlar merhaba, elimde halihazırda sadece bir değer girilerek yapılan bir yazılım var kendim yazdığım. Ancak ben şunu yapmak istiyorum 20-50 arası tüm değerlerin girilmesiyle oluşturulmuş sonuçları dosyaya yazmak istiyorum bunu nasıl yapabilirim?
@312971 bu arkadaşın işini görür :).

C#:
int sayi = 50;

if(sayi >= 20 and sayi <= 50){
    StreamWriter Yaz = new StreamWriter("C:\Sayi.txt");
    Yaz.Write(sayi.ToString());
    Yaz.Close();
}else{
    MessageBox.Show("Lütfen 20 ile 50 arası sayı giriniz!","Program");
}
 
Önceden yazdığınız kodu parametrik hale getirip istediğiniz değerleri çağıracaksanız.
"Önceki" kodun ne olduğu ile ilgili gram bilgi vermediğiniz için OtherMethod(); olduğunu var saydım.
C#:
using (var wrtr = new StreamWriter("outputFile.txt", false))
{
  for (int i = 20; i < 50; i++)
  {
    wrtr.WriteLine(OtherMethod(i));
  }
}           }

Eğer çıktılar alt alta değilde yan yana yazılacaksa wrtr.Write(OtherMethod(i)); şeklinde olmalı. Bir birine yapışık olmamaları için araya bir seperatör atabilirsiniz. StreamWriter'ı kullanabilmek için kodun en üst kısmında using System.IO; ifadesi bulunmalı.

Basit işlerde sorun çıkartmaz ancak döngü ile tek tek dosya yazmak IO overhead'i yaratabilir.
Çıktıları tek bir String içerisine StringBuilder ile toplayıp tek seferde yazdırmak daha zarif bir çözüm

C#:
StringBuilder sb = new StringBuilder();
for (int i = 20; i < 50; i++)
{
  sb.Append(OtherMethod(i));
}
using (var wrtr = new StreamWriter("outputFile.txt", false))
{
  wrtr.Write(sb.ToString());
}
 
Son düzenleme:
C#:
    private void button1_Click(object sender, EventArgs e)
        {
            double grs80a = 6378137.00, grs80b = 6356752.3141;
            double Enlem, Boylam, Yukseklik;

            Enlem = Convert.ToDouble(txtEnlem.Text);
            Boylam = Convert.ToDouble(txtBoylam.Text);
            Yukseklik = Convert.ToDouble(txtYukseklik.Text);

            double A, B;
            A = (Math.PI / 180) * Enlem;
            B = (Math.PI / 180) * Boylam;

            double ke2;
            ke2 = ((grs80a * grs80a) - (grs80b * grs80b)) / (grs80a * grs80a);

            double N;
            N = (grs80a / (Math.Sqrt(1 - (ke2 * ((Math.Sin(A)) * (Math.Sin(A)))))));

            double X, Y, Z;
            X = (N + Yukseklik) * (Math.Cos(A)) * (Math.Cos(B));
            Y = (N + Yukseklik) * (Math.Cos(A)) * (Math.Sin(B));
            Z = (((1 - ke2) * N + Yukseklik)) * (Math.Sin(B));

            lblX.Text = X.ToString();
            lblY.Text = Y.ToString();
            lblZ.Text = Z.ToString();

@The Anorak
@Eray T
@312971

Şimdi yapmak istediğim şu, yukarıda enlem,boylam,yükseklik olarak girilecek değerlere örneği enlemi 20-50 derece arası olan 30 derece boylamındaki 1000m yükseklikteki tüm noktaların koordinatlarını bir çıktı olarak bize veren bir komutu nasıl yazabilirim onu demiştim. Teşekkür ederim.
 
SRP (Single Responsibility Principle)'e göre bir method bir tek bir şey yapmalı ve onu da en iyi şekilde yapmalı.

Kodu anlamlı en küçük parçalara ayırıp parametrik hale getirmeniz gerekiyor.

(Kodu TextEdit üzerinden yazdığım için derleyip kontrol etmedim. Küçük hatalar bulunabilir. Ancak genel mantık budur.)
C#:
private static const double GRS80A = 6378137.00;
private static const double GRS80B = 6356752.3141;
private static const double KE2 = (GRS80A * GRS80A - GRS80B * GRS80B) / (GRS80A * GRS80A); // Sabit değerlerden oluştuğu için bu da bir sabittir.

private Point3D GetDataFromGUI()
{
  // TODO Try-Catch ile kontrol edilse çok daha iyi olur.
  double enlem = Convert.ToDouble(txtEnlem.Text);
  double boylam = Convert.ToDouble(txtBoylam.Text);
  double yukseklik = Convert.ToDouble(txtYukseklik.Text);
  return new Point3D(enlem, boylam, yukseklik);
}

private Point3D CalculateXYZ(Point3D coor)
{
  double enlemRad = (Math.PI / 180) * coor.X;
  double boylamRad = (Math.PI / 180) * coor.Y;
  double n = GRS80A / Math.Sqrt(1 - KE2 * Math.Sin(enlemRad) * Math.Sin(enlemRad)); // Çarpma zaten çıkart işlemine göre önceliklidir paranteze gerek yok
  double x = (n + coor.Z) * Math.Cos(enlemRad) * Math.Cos(boylamRad);
  double y = (n + coor.Z) * (Math.Cos(enlemRad)) * (Math.Sin(boylamRad));
  double z = ((1 - KE2) * n + coor.Z) * Math.Sin(boylamRad);
  return new Point3D(x, y, z);
}

private void UpdateGUI(Point3D xyz)
{
  this.lblX.Text = xyz.X.ToString();
  this.lblY.Text = xyz.Y.ToString();
  this.lblZ.Text = xyz.Z.ToString();
}

private void button1_Click(object sender, EventArgs e)
{
  UpdateGUI(CalculateXYZ(GetDataFromGUI()));
}


Daha sonrasında veri isterse GUI üzerindeki textBox'tan gelsin isterse For döngüsü içerisinden fark etmiyor.

C#:
List<Point3D> points = new List<Point3D>();
for(int i = 20; i <= 50; i++)
{
  points.Add(CalculateXYZ(i, 30, 1000));   
}
 
Son düzenleme:
SRP (Single Responsibility Principle)'e göre bir method bir tek bir şey yapmalı ve onu da en iyi şekilde yapmalı.

Kodu anlamlı en küçük parçalara ayırıp parametrik hale getirmeniz gerekiyor.

(Kodu TextEdit üzerinden yazdığım için derleyip kontrol etmedim. Küçük hatalar bulunabilir. Ancak genel mantık budur.)
C#:
private static const double GRS80A = 6378137.00;
private static const double GRS80B = 6356752.3141;
private static const double KE2 = (GRS80A * GRS80A - GRS80B * GRS80B) / (GRS80A * GRS80A); // Sabit değerlerden oluştuğu için bu da bir sabittir.

private Point3D GetDataFromGUI()
{
  // TODO Try-Catch ile kontrol edilse çok daha iyi olur.
  double enlem = Convert.ToDouble(txtEnlem.Text);
  double boylam = Convert.ToDouble(txtBoylam.Text);
  double yukseklik = Convert.ToDouble(txtYukseklik.Text);
  return new Point3D(enlem, boylam, yukseklik);
}

private Point3D CalculateXYZ(Point3D coor)
{
  double enlemRad = (Math.PI / 180) * coor.X;
  double boylamRad = (Math.PI / 180) * coor.Y;
  double n = GRS80A / Math.Sqrt(1 - KE2 * Math.Sin(enlemRad) * Math.Sin(enlemRad)); // Çarpma zaten çıkart işlemine göre önceliklidir paranteze gerek yok
  double x = (n + coor.Z) * Math.Cos(enlemRad) * Math.Cos(boylamRad);
  double y = (n + coor.Z) * (Math.Cos(enlemRad)) * (Math.Sin(boylamRad));
  double z = ((1 - KE2) * n + coor.Z) * Math.Sin(boylamRad);
  return new Point3D(x, y, z);
}

private void UpdateGUI(Point3D xyz)
{
  this.lblX.Text = xyz.X.ToString();
  this.lblY.Text = xyz.Y.ToString();
  this.lblZ.Text = xyz.Z.ToString();
}

private void button1_Click(object sender, EventArgs e)
{
  UpdateGUI(CalculateXYZ(GetDataFromGUI()));
}


Daha sonrasında veri isterse GUI üzerindeki textBox'tan gelsin isterse For döngüsü içerisinden fark etmiyor.

C#:
List<Point3D> points = new List<Point3D>();
for(int i = 20; i <= 50; i++)
{
  points.Add(CalculateXYZ(i, 30, 1000));
}
Hocam bu sonucu nasıl .txt olarak alabilirim direkt @The Anorak

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Printing;

namespace bitirme2
{
    public partial class dyazma : Form
    {
        public dyazma()
        {
            InitializeComponent();
           
        }
        PrintDialog PRD = new PrintDialog();
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {

           
            for (double i = Convert.ToDouble(textBox1.Text); i <= Convert.ToDouble(textBox2.Text); i+=1)
            for (double j = Convert.ToDouble(textBox3.Text); j <= Convert.ToDouble(textBox4.Text); j += 1)
            for (double k = Convert.ToDouble(textBox5.Text); k <= Convert.ToDouble(textBox6.Text); k += 1)

                    {

                        double wgs84a = 6378137.00, wgs84b = 6356752.31424518;
                        double A,B;
                A = (Math.PI / 180) * i;
                 B = (Math.PI / 180) * j;


                        double ke2;
                        ke2 = ((wgs84a * wgs84a) - (wgs84b * wgs84b)) / (wgs84a * wgs84a);

                        double N;
                        N = (wgs84a / (Math.Sqrt(1 - (ke2 * ((Math.Sin(A)) * (Math.Sin(A)))))));

                        double X, Y, Z;
                        X = (N + k) * (Math.Cos(A)) * (Math.Cos(B));
                        Y = (N + k) * (Math.Cos(A)) * (Math.Sin(B));
                        Z = (((1 - ke2) * N + k)) * (Math.Sin(B));
                        this.deneme1.Items.Add(X);
                        this.deneme2.Items.Add(Y);
                        this.deneme3.Items.Add(Z);
                     

                    }
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
         
           
                SaveFileDialog save = new SaveFileDialog();
                save.Filter = "Metin Dosyası|*.txt";
                save.OverwritePrompt = true;
                save.CreatePrompt = true;

                if (save.ShowDialog() == DialogResult.OK)
                {
                    StreamWriter Kayit = new StreamWriter(save.FileName);
                    Kayit.WriteLine(deneme1.Text);
                    Kayit.Close();
                }
           

        }

 

     
    }
}

@Evilmonster
@Silinen üye

Arkadaşlar size de sormak istiyorum, burada deneme1'e gelen hesaplama sonucunu yazdırmıyor. Yani yazdırınca çıkan dosya boş oluyor sebebi nedir? Yani öyle bir kod yazsam ki hep hesaplasın hesapladığı değerleri hafızada tutup aynı anda da yazsın nasıl yapılabilir bu?
 
Son düzenleme:
Arkadaşlar size de sormak istiyorum, burada deneme1'e gelen hesaplama sonucunu yazdırmıyor. Yani yazdırınca çıkan dosya boş oluyor sebebi nedir?
Deneme1'in içindekileri yazmak istiyorsanız bir foreach döngüsü açmanız gerekiyor.
[CODE lang="csharp" title="C#"]foreach(ListBoxItem item in deneme1.Items){
Kayit.WriteLine(item.Text);
}[/CODE]
 
Son düzenleme:

Yeni konular

Geri
Yukarı