Zamykanie pliku podczas działania programu + sortowanie.

0

Witam!
1.wczytuje plik, zapisuję go jako inny i niby wszystko w porządku tylko jak zrobić żeby plik zamkną się po wykonaniu wszystkich operacji?
2.Jak zmodyfikować kod by sortował(po jego utworzeniu dopiero!) linie, w pliku "aab.txt" wdł 2 wartości( w każdej lini) oddzielonej wybranym znakiem np 'x'. Fajnie by było gdyby kod był podany, ale wskazówki chyba więcej nauczą ;)

[code]{

String^ fileName = OpenDialog->FileName ;
StreamReader^ din = File::OpenText(fileName);
String^ str;
int count = 0;
String^ fileName2 = "aab.txt";
StreamWriter^ sw = gcnew StreamWriter(fileName2);
while ((str = din->ReadLine()) != nullptr)
{ sw->Flush();
sw->WriteLine(str);
count++;

}

}[/code]

PS>program nie przepisuje mi ostatniej linijki ;)

0

Ponieważ składnia C++ w .NET wywołuje u mnie mdłości (podobnie jak VB) :) to przykład w C# (uwaga - brak try-catch, sprawdzania potencjalnych błędów, jednym słowem wersja mini :) ). Ze względu na ładowanie zawartości pliku do ArrayList w drugim punkcie, metoda nadaje się dla niezbyt dużych plików.

Ad. 1. Np. tak:

			FileStream fsRead = new FileStream("file1.txt", FileMode.Open, FileAccess.Read);
			StreamReader sr = new StreamReader(fsRead);

			FileStream fsWrite = new FileStream("file2.txt", FileMode.OpenOrCreate, FileAccess.Write);
			StreamWriter sw = new StreamWriter(fsWrite);

			String s = "";
			while ((s = sr.ReadLine()) != null)
			{
				sw.WriteLine(s);
			}

			sw.Flush();
			sw.Close();
			sr.Close();
 

Ad. 2. Np. tak:

 
			FileStream fsRead = new FileStream("d:\\work\\file1.txt", FileMode.Open, FileAccess.Read);
			StreamReader sr = new StreamReader(fsRead);

			FileStream fsWrite = new FileStream("d:\\work\\file2.txt", FileMode.OpenOrCreate, FileAccess.Write);
			StreamWriter sw = new StreamWriter(fsWrite);

			String s = "";
			ArrayList arr = new ArrayList();

			while ((s = sr.ReadLine()) != null)
			{
				arr.Add(s);
			}
			
			arr.Sort();
			for (int i = 0; i < arr.Count; i++)
			{
				sw.WriteLine(arr[i]);
			}

			sw.Flush();
			sw.Close();
			sr.Close();
0

niezbyt rozumeim część środkową chodziło mi dokładnie o posortowanie czegos takiego
[code]www
xxx
www

0,3, 0,004716, 0,000000
0,8, 0,005682, 0,000000
0,7, 0,004914, 0,000000
0,5, 0,008304, 0,000000
0,2, 0,008600, 0,000000
0,22, 0,009814, 0,000000
0,1, 0,003875, 0,000000
0[/code]

względem 2 liczby po ","

czyli o zrobienie czegoś takiego, jeżeli to to co wyżej to przepraszam, ale to chyba nie to ;)
[code]www
xxx
www

0,1, 0,003875, 0,000000
0,2, 0,008600, 0,000000
0,3, 0,004716, 0,000000
0,5, 0,008304, 0,000000
0,6, 0,008192, 0,000000
0,7, 0,004914, 0,000000
0,8, 0,005682, 0,000000
0,22, 0,009814, 0,000000
[/code]

0

Byc może źle zrozumiałem. Czyli chodzi mniej więcej o cos takiego (sortowanie liczb w każdej linii). W sumie to może nawet będzie działać przez sortowanie samych stringów, bez parsowania ich na Double. Obecny kod obcina zbędne zera w pliku docelowym, dodaje " " na końcu linii i nie sprawdza błędów/wyjątków. Ale to pozostawiam do własnego przerobienia.

FileStream fsRead = new FileStream("file1.txt", FileMode.Open, FileAccess.Read);
			StreamReader sr = new StreamReader(fsRead);

			FileStream fsWrite = new FileStream("file2.txt", FileMode.OpenOrCreate, FileAccess.Write);
			StreamWriter sw = new StreamWriter(fsWrite);

			String s = "";
			ArrayList arr = new ArrayList();
			while ((s = sr.ReadLine()) != null)
			{
				String[] sNumbers = s.Split(' ');
				arr.Clear();
				foreach (String sNum in sNumbers)
				{
					String s2 = sNum;
					if (s2[s2.Length - 1] == ',')
					{
						s2 = s2.Remove(sNum.Length - 1);
					}

					Double d = Double.Parse(s2);
					arr.Add(d);
				}

				arr.Sort();

				StringBuilder sb = new StringBuilder();

				for (int i = 0; i < arr.Count; i++)
				{
					sb.Append(arr[i].ToString() + " ");
				}
				sw.WriteLine(sb.ToString());
			}

			sw.Flush();
			sw.Close();
			sr.Close();
0

jak ArrayList w c++ się zwie?
szkoda że to w c# jest...

int main() {
   StreamReader^ pliktekstowy;
String^ liniatekstu;
array<String^>^ linietekstu = gcnew array<String^>(230);
int licznik = 0;
array<String^>^ punkt = gcnew array<String^>(2);
			 {
		pliktekstowy = File::OpenText("1.txt");
		while((liniatekstu = pliktekstowy->ReadLine()) !=nullptr)
		{
			linietekstu[licznik] = liniatekstu;
			licznik++;
		}
		//pliktekstowy->Close();
		
		for(int i=5; i<licznik-1; i++)
		
		
		{punkt = linietekstu[i]->Split(',');
		int b = Convert::ToInt32(punkt[1]);
		
			 
			 
		
		
		array<int>^ a = b;
		
		Array::Sort( a );
		for (int i=0; i < a->Length; i++)
			Console::Write("{0} ", a[i] );
		}

	   
   {
     }
    

			 
			 
			  }

			 Console::ReadLine();
			 return 0;
}

Coś takiego mam, jak to przerobić by działało?

0

ArrayList z C# nazywa się w C++ .NET ArrayList;

A tu masz nawet przykładowy programik:
http://msdn.microsoft.com/en-us/library/system.collections.arraylist%28v=VS.100%29.aspx#Y2850

Wystarczy chwilę poszukać, to naprawdę nie jest trudno znaleźć :)

0

Fuu, nie używajcie ArrayList tylko List<T>.

I dlaczego w ogóle autor wątku w C++/CLI pisze? I to jeszcze UI? Jakiś sensowny powód?

0

projekt na studia...., przykro mi ale kiedyś "siedziałem" tez w VB, a że to na zajęciach poznałem to już w tym projekt skończę ;)

{ String^ fsRead  = "1.txt";
  StreamReader^ sr = gcnew StreamReader(fsRead);
 
  String^ fsWrite = "2.txt";
  StreamWriter^ sw = gcnew StreamWriter(fsWrite);

  String^ s = "";
  ArrayList^ arr = gcnew ArrayList;
  while ((s = sr->ReadLine()) != nullptr)
  {
            arr->Add(s);
	  
  
  }
  arr->Sort();
  {for (int i = 0; i < (arr->Count); i++);
  {
  
	  sw->WriteLine(arr(i));}
  
                        
                      


                        sw->Flush();
                        sw->Close();
                        sr->Close();





}
                       
   
	//Console::ReadLine();
    //return 0;
    
}
}

to kod Tomka2, ptrzerobiony ale niewidzi zdeklarowego i w

 sw->WriteLine(arr(i)

);

0
{for (int i = 0; i < (arr->Count); i++);

masz średnik na koncu linii. Usuń go. No i po co ta klamra otwierająca przed "for"

0
Tomek2 napisał(a)
{for (int i = 0; i < (arr->Count); i++);

masz średnik na koncu linii. Usuń go. No i po co ta klamra otwierająca przed "for"

Error 1 error C2064: term does not evaluate to a function taking 1 arguments xxx\pro3sort.cpp 32

{
   String^ fileName = "1.txt";
   StreamReader^ din = File::OpenText(fileName);

   String^ str;
   int count = 0;
   String^ fileName2 = "6.txt";
	StreamWriter^ sw = gcnew StreamWriter(fileName2);
   while ((str = din->ReadLine()) != nullptr) 
   {
      
     
	   Console::WriteLine("linia {0}: {1}", count, str );
	   
	  sw->Flush();
      sw->WriteLine(str);
      
	  count++;

   
   }

jak możliwość sortowania podanną w 3 poście stawić do tego kodu?

0
using namespace System;
using namespace System::Collections;
using namespace System::IO;
using namespace System::Text;

int main(array<System::String ^> ^args)
{
   String^ fileName = "1.txt";
   StreamReader^ din = File::OpenText(fileName);
 
   String^ s;
   ArrayList^ arr = gcnew ArrayList();
   String^ fileName2 = "2.txt";
   StreamWriter^ sw = gcnew StreamWriter(fileName2);

   while ((s = din->ReadLine()) != nullptr) 
   {
		array<System::String^>^ sNumbers = s->Split(' ');
        arr->Clear();

		for(int i=0; i<sNumbers->Length; i++)
        {
			String^ s2 = sNumbers[i];
            if (s2[s2->Length - 1] == ',')
            {
				s2 = s2->Remove(s2->Length - 1);
            }
 
            Double^ d = Double::Parse(s2);
            arr->Add(d);
        }
 
        arr->Sort();
 
        StringBuilder^ sb = gcnew StringBuilder();
 
        for (int i = 0; i < arr->Count; i++)
        {
                sb->Append(arr[i]->ToString() + " ");
        }
        sw->WriteLine(sb->ToString());
   }

   sw->Flush();
   sw->Close();
   din->Close();
   
   return 0;
}

Linia

 StreamReader^ din = File::OpenText(fileName);

wywala mi exception, więc nie sprawdziłem, czy całośc działa. Ale się kompiluje.

BTW: chyba pierwszy raz przenosiłem coś z C# do C++/CLR i stwierdzam, że C++/CLR to czysty masochizm. Mam VS2010 Express i nawet nie ma autouzupełniania metod obiektów klas czy uzupełniania sekcji "using", które bardzo fajnie działają w C#. Współczuję, jesli musisz pisać ten program w C++/CLR. Chyba że masz lepszą wersję Visuala i tam takie rzeczy są.

0

z czegoś takiego

0,3, 0,004716, 0,000000
0,8, 0,005682, 0,000000
0,7, 0,004914, 0,000000
0,5, 0,008304, 0,000000

robi coś takiego

0 0,004716 0,3 
0 0,005682 0,8 
0 0,004914 0,7 
0 0,008304 0,5 

więc nie działa prawidłowo...
a powinno być

0,3, 0,004716, 0,000000
0,5, 0,008304, 0,000000
0,7, 0,004914, 0,000000
0,8, 0,005682, 0,000000
0

Dokładnie to samo napisałem kilka postów temu. Proponowałem wtedy, że być może wystarczy porównac stringi zamiast parsować je na tym Double.

0
#include "stdafx.h"
using namespace System::IO;
using namespace System;
using namespace System::Collections;
void PrintValues( IEnumerable^ myList );

ref class MyClass {};

int main(){


{ String^ fsRead  = "1.txt";
  StreamReader^ sr = gcnew StreamReader(fsRead);
 
  String^ fsWrite = "2.txt";
  StreamWriter^ sw = gcnew StreamWriter(fsWrite);

  String^ s = "";
  ArrayList^ arr = gcnew ArrayList;
  while ((s = sr->ReadLine()) != nullptr)
  {
            arr->Add(s);
	  
  
  }
  arr->Sort();
  for (int i = 0; i < (arr->Count); i++)
  {
  
	  sw->WriteLine(arr(i));}
  
                        
                      


                        sw->Flush();
                        sw->Close();
                        sr->Close();





                        
   
	//Console::ReadLine();
    //return 0;
    
}
}

jak w takim razie w tym,naprawić ten błąd?

Error 1 error C2064: term does not evaluate to a function taking 1 arguments xxx\pro3sort.cpp 32

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