C# Dosyadan Okuma

Öncelikle bir şeyden dolayı özür dilemek istiyorum, test yapmadan size çözüm sunduğum için birkaç yanlış yapmışım. Boşluk ile bölünce karakter karakter böldüğünden birden çok indis oluşuyor ve bazı indisler boş çıkıyormuş.

Bunun dışında ReadLines yerine ReadAllLines koydum ve böylece direkt olarak yazı dizisi olarak değer döndürdü.

[CODE lang="csharp" title="C#"]
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "Metin Dosyaları|*.txt";
openFileDialog1.Title = "Bir koordinat dosyası seçin";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
string path = openFileDialog1.FileName;
string[] lines = File.ReadAllLines(path);
foreach(string line in lines)
{
string[] coords = line.Split(' ');
coords = coords.Distinct().ToArray();
listBox1.Items.Add(coords[0].Trim());
listBox2.Items.Add(coords[2].Trim());
listBox3.Items.Add(coords[3].Trim());
}
}
}[/CODE]

Kodun son hali bu.

Bu çokça olan boşlukları Distinct() fonksiyonu ile sildim. Bu fonskiyon, aynı olan değerleri silip tek değer bırakıyor. a a a b dizisini a b olarak yeniden yazıyor kısaca.
Böyle yapınca x boşluk y z dizesi oluşuyordu. Bunları da listeye ekledim.
 
Öncelikle bir şeyden dolayı özür dilemek istiyorum, test yapmadan size çözüm sunduğum için birkaç yanlış yapmışım. Boşluk ile bölünce karakter karakter böldüğünden birden çok indis oluşuyor ve bazı indisler boş çıkıyormuş.

Bunun dışında ReadLines yerine ReadAllLines koydum ve böylece direkt olarak yazı dizisi olarak değer döndürdü.

[CODE lang="csharp" title="C#"]
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "Metin Dosyaları|*.txt";
openFileDialog1.Title = "Bir koordinat dosyası seçin";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
string path = openFileDialog1.FileName;
string[] lines = File.ReadAllLines(path);
foreach(string line in lines)
{
string[] coords = line.Split(' ');
coords = coords.Distinct().ToArray();
listBox1.Items.Add(coords[0].Trim());
listBox2.Items.Add(coords[2].Trim());
listBox3.Items.Add(coords[3].Trim());
}
}
}[/CODE]

Kodun son hali bu.

Bu çokça olan boşlukları Distinct() fonksiyonu ile sildim. Bu fonskiyon, aynı olan değerleri silip tek değer bırakıyor. a a a b dizisini a b olarak yeniden yazıyor kısaca.
Böyle yapınca x boşluk y z dizesi oluşuyordu. Bunları da listeye ekledim.
Aynı hatayı vermeye devam ediyor, anlayamadım neden böyle yapıyor. Uğraştığınız için çok teşekkür ederim.
 
Rica ederim. Aynı hatadan kastınız nedir?

Kodu kendim denediğimde çalıştı, acaba farklı değişkenler mi tanımladınız?
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;

namespace bitirme2
{
    public partial class dokuma : Form
    {
      
      
    
 
        public dokuma()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Filter = "Metin Dosyaları|*.txt";
            openFile.Title = "Bir koordinat dosyası seçin";
            DialogResult result = openFile.ShowDialog();
            if (result == DialogResult.OK)
            {
                string path = openFile.FileName;
                string[] lines = File.ReadAllLines(path);
                foreach (string line in lines)
                {
                    string[] coords = line.Split(' ');
                    coords = coords.Distinct().ToArray();
                    listBox1.Items.Add(coords[0].Trim());
                    listBox2.Items.Add(coords[2].Trim());
                    listBox3.Items.Add(coords[3].Trim());
                }
            }
        }
    }
}

Şu şekilde yaptım çünkü OpenFileDialog1 tanımlı gözükmüyordu.
dizin dizi sınırlarının dışındaydı hatası verdi yine bahsettiğim hata buydu
 
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;

namespace bitirme2
{
    public partial class dokuma : Form
    {
    
    
  

        public dokuma()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Filter = "Metin Dosyaları|*.txt";
            openFile.Title = "Bir koordinat dosyası seçin";
            DialogResult result = openFile.ShowDialog();
            if (result == DialogResult.OK)
            {
                string path = openFile.FileName;
                string[] lines = File.ReadAllLines(path);
                foreach (string line in lines)
                {
                    string[] coords = line.Split(' ');
                    coords = coords.Distinct().ToArray();
                    listBox1.Items.Add(coords[0].Trim());
                    listBox2.Items.Add(coords[2].Trim());
                    listBox3.Items.Add(coords[3].Trim());
                }
            }
        }
    }
}

Şu şekilde yaptım çünkü OpenFileDialog1 tanımlı gözükmüyordu.
dizin dizi sınırlarının dışındaydı hatası verdi yine bahsettiğim hata buydu
Hatayı nerede veriyor?

Döngünün başına coords'u tanımlamadan önce MessageBox.Show(line) ibaresini ekleyin. Böylece okuduğu satırı görmüş olacaksınız.

Bunun dışında Distinct() fonksiyonunun altına başka bir döngü açın.
[CODE lang="csharp" title="C#"]
string e = "";
foreach(string s in coords){
e += $"\n({s})"
}
MessageBox.Show(e);
[/CODE]

Böylece böldüğü elemanları listelemiş olursunuz.

Çıktıların fotoğrafını atabilirsiniz.
 
Hatayı nerede veriyor?

Döngünün başına coords'u tanımlamadan önce MessageBox.Show(line) ibaresini ekleyin. Böylece okuduğu satırı görmüş olacaksınız.

Bunun dışında Distinct() fonksiyonunun altına başka bir döngü açın.
[CODE lang="csharp" title="C#"]
string e = "";
foreach(string s in coords){
e += $"\n({s})"
}
MessageBox.Show(e);
[/CODE]

Böylece böldüğü elemanları listelemiş olursunuz.

Çıktıların fotoğrafını atabilirsiniz.
resim_2021-03-22_185817.png

Tam anlayamadım demek istediğinizi.
 
[CODE lang="csharp" title="C#"]foreach (string line in lines)
{
MessageBox.Show(line);

string[] coords = line.Split(' ');
coords = coords.Distinct().ToArray();

string e = "";
foreach(string s in coords){
e += $"\n({s})"
}
MessageBox.Show(e);

listBox1.Items.Add(coords[0].Trim());
listBox2.Items.Add(coords[2].Trim());
listBox3.Items.Add(coords[3].Trim());
}[/CODE]

Bu şekilde olmalı döngü. Böylece programın hangi değişkenlerle uğraştığını görebiliriz, çıkan mesajların fotoğrafını atabilir misiniz?
 
[CODE lang="csharp" title="C#"]foreach (string line in lines)
{
MessageBox.Show(line);

string[] coords = line.Split(' ');
coords = coords.Distinct().ToArray();

string e = "";
foreach(string s in coords){
e += $"\n({s})"
}
MessageBox.Show(e);

listBox1.Items.Add(coords[0].Trim());
listBox2.Items.Add(coords[2].Trim());
listBox3.Items.Add(coords[3].Trim());
}[/CODE]

Bu şekilde olmalı döngü. Böylece programın hangi değişkenlerle uğraştığını görebiliriz, çıkan mesajların fotoğrafını atabilir misiniz?

Hata CS0136 'e' adlı bir yerel veya parametre, bu ad bir kapanış yerel kapsamında bir yereli veya parametreyi tanımlamak için kullanıldığından bu kapsamda ifade edilemiyor . E için bu hatayı verdi ama tanımlamada mı sıkıntı oldu ki?
 
Hata CS0136 'e' adlı bir yerel veya parametre, bu ad bir kapanış yerel kapsamında bir yereli veya parametreyi tanımlamak için kullanıldığından bu kapsamda ifade edilemiyor . E için bu hatayı verdi ama tanımlamada mı sıkıntı oldu ki?
Değişkenin adını değiştirin, e yerine başka bir şey koyun. Muhtemelen EventArgs ile karıştı.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Geri
Yukarı