Jak wczytać z pliku do zmiennej?

0
static void Main(string[] args)
        {
            string linia;
            string imie;
            StreamReader sw = new StreamReader("plik.txt");
            while((linia = sw.ReadLine()) !=null)
            {
                imie = linia.Split(null);
            }
            sw.Close();
           // Console.ReadKey();
        }

Coś takiego próbowałem, lecz coś jest nie tak.

0

Jasne, staraj się umieścić zbiór ciągów w ciągu, powodzenia

0

string chyba w stringu trzeba umieścić? Bo jak inaczej?

0

Dlaczego w pętli while wypisze mi zawartość stringa imie, a już po whilu jest błąd?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;



namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            string linia, imie;
            
            StreamReader sw = new StreamReader("plik.txt");
            while((linia = sw.ReadLine()) !=null)
            {
                Console.WriteLine(linia);
                imie = linia;
                Console.WriteLine(imie);
            }
            sw.Close();
          // Console.WriteLine(imie);
            Console.ReadKey();
        }
    }
}
 
0

Wyobraź sobie, że jeden taki string to jedna kartka, a cały plik to książka.
Wertujesz kartka po kartce i po przewróceniu na drugą stronę dziwisz się, że jednocześnie nie widzisz pierwszej :P

Poza tym jest błąd to, standardowo, możesz mówić pani na infolinii tepsy - na forum programistycznym opisuj co się dzieje.

0

Za whilem nie chce mi wypisać zmiennej imie, bo jak pokazuje kompilator zmienna ta nie ma przydzielonej wartości. Ale przecież ją ma.

0

Powinno przecież wypisać ostatnio wartość (ostatnio linie) z pliku.

3

Ale przecież ją ma.

Niekoniecznie musi mieć.

string linia, imie;

Nie inicjujesz zmiennej imie, stąd gdybyś chciał wczytać pusty plik, sterownie nigdy nie weszłoby do pętli i... cóż - kompilator mądrzejszy od programisty ;)

0

W c++ normalnie by to działało. Jak powinno to wyglądać w c#?

0

Kurczę, pomyśl no.
Masz niezainicjowaną zmienną typu string - jak ją zainicjujesz?

0

Ok dzięki teraz działa:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;



namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            string linia, imie = "";

            StreamReader sw = new StreamReader("plik.txt");
            while ((linia = sw.ReadLine()) != null)
            {
                Console.WriteLine(linia);
                imie = linia;
                Console.WriteLine(imie);
            }
            sw.Close();
            Console.WriteLine(imie);
            Console.ReadKey();
        }
    }
}
 

To w c# trzeba od razu inicjowac stringi? Bo w c++ tak nie ma takiej potrzeby.

0

Nie trzeba, ale wtedy nie można się odwoływać do niego. Jeśli nie jesteś pewny to inicjujesz.

Swoją drogą polecam do tego bardziej

string myString = string.Empty 
0

A jeśli mam tablicę stringów, to mam pętlą najpierw zainicjować całą tabelę?
Za bardzo tego nie rozumiem czemu w pętli while mogę wypisać zmienną imie bez wcześniejszej inicjalizacji, a po za nią już nie jak tak zmienna nie jest lokalna.

0

W c++ działa bez uprzedniej inicjalizacji zmiennej:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    string imie;
    ifstream plik("plik.txt");

    while(!plik.eof())
    {
        plik >> imie;
    }
    cout << imie;
    return 0;
}
0

Dodam, że plik zarówno w c# i c++ nie jest pusty. I nie wiem czemu, ale w c# bez uprzedniej inicjalizacji zmiennej przed pętlą while program potem jej nie wypisze za pętlą while.

0

Może być sytuacja - już tu opisana, że nie wejdzie Ci do pętli while w ogóle i wtedy będziesz miał próbę wypisania obiektu który nie jest zainicjalizowany.

Co do tablicy - to byłoby rozsądne, albo jeszcze lepiej - nie używaj tablicy tylko jakiejś kolekcji, np. listy i dodawaj stringi do niej tylko zainicjalizowane.

inne obejście problemu - brzydkie ale skuteczne też - sprawdzaj przed wypisaniem czy innym użyciem czy nie jest nullem (bądź czy nie jest pusty jeśli to tez przeszkadza). jest do tego "fajna" metoda o ile pamiętam to:

 if (String.IsNullOrEmpty(myString))

albo lepiej, ze sprawdzeniem czy nie ma samych białych znaków:

 if (String.IsNullOrWhitespace(myString))

Generalnie pamiętaj ze string to typ referencyjny a nie typ prosty. (Jak nie wiesz czemu masz uważać i co to znaczy - doczytaj sobie :) )

0

Wiem co to referencja. Jednak teraz działa nawet bez uprzedniej inicjalizacji, mimo, że pokazuje błąd.

0

Co do tablicy to nie musisz ich inicjalizować, w Javie typy numeryczne są automatycznie inicjalizowane na 0, boolowskie na false a obiektowe (więc String również) na null. Podejrzewam, że w C# jest tak samo. Zrób sobie tablicę Stringów, nie inicjalizuj i spróbuj ją wyświetlić to się przekonasz :P

0

Za bardzo tego nie rozumiem czemu w pętli while mogę wypisać zmienną imie bez wcześniejszej inicjalizacji, a po za nią już nie jak tak zmienna nie jest lokalna.

A wyobraź sobie, że nie inicjujesz zmiennej imie i program nie wchodzi do pętli (bo np. plik jest pusty), co ma niby wypisać na konsolę w miejscu Console.WriteLine(imie);?

0

Może to głupie pytanie, ale co jest odpowiednikiem cina w c#?

0

już znalazłem readkey()

0

Może mógłby ktoś naprowadzić czemu teraz łańcucha "imie" nie chce zapisać do pliku do zapisu?:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;



namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            string linia, imie = string.Empty, nazwa;

            Console.Write("Podaj nazwe pliku z koncowka .txt: ");
            nazwa = Console.ReadLine();

            StreamReader odczyt = new StreamReader(nazwa);
            StreamWriter zapis = new StreamWriter("plikmax.txt");
            

            while ((linia = odczyt.ReadLine()) != null)
            {
                Console.WriteLine(linia);
                imie = linia;
                Console.WriteLine(imie);
            }

            zapis.Write("imie");
            Console.WriteLine(imie);
            Console.ReadKey();
            odczyt.Close();
            zapis.Close();
        }
    }
}
 
0

Zapisujesz do pliku ciąg znaków, a nie wartość zmiennej.

0

Wiem, i właśnie ten ciąg znaków nie chcę się zapisać do pliku nie wiem czemu.

0

Ach, faktycznie, mea culpa.
Plik się tworzy?

0

tak

0

Spróbuj wykorzystać blok using.

0

ale jak ten blok się nazywa? chodzi o deklaracje przy bibliotekach?

0

jak usunę pętlę while to jest ok, ale nie wiem w czym problem jak w tej pętli nie używam tego pliku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1