Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор сторки 
:(
    Опции темы
Competitor
Дата 22.10.2006, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: -1
Всего: -1



У меня есть текстовый файл, содержащий целочисленные значения. Например, 1 2 3 4 5. Я считал эти значения в объект string s. Как теперь заполнить массив этими значениями? Ну т.е. есть ли в C# аналог C++ного sscanf()? Да и как объявить динамический  одномерный массив, в который я хочу занести эти числа из файла, ведь неизвестно сколько именно будет чисел.
PM MAIL WWW   Вверх
ivashkanet
Дата 22.10.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Competitor,
во первых: в файле лежат только числа? Они разделены пробелом? Число в одной строке ?
Если да, то читаем строку с числами из файла, разделяем строку на элементы сплитом (Split()), а потом преобразуем "строковые числа" в обычные.


Код

            StreamReader sr = new StreamReader(@"C:\123.456");
            string str = sr.ReadLine();
            sr.Close();

            string[] strArr = str.Split(' ');
            int[] intArr = new int[strArr.Length];

            for (int i = 0; i < strArr.Length; i++)
            {
                try
                {
                    intArr[i] = int.Parse(strArr[i]);
                }
                catch (FormatException)
                { Console.WriteLine("Енто не число: " + strArr[i]); }
                catch (OverflowException)
                { Console.WriteLine("Слишком большое число: " + strArr[i]); }
            }

            foreach (int i in intArr)
            {
                Console.WriteLine(i);
            }



Если строк больше одной, то можно делать так:
Код

            StreamReader sr = new StreamReader(@"C:\123.456");
            string str = sr.ReadToEnd();
            sr.Close();

            string[] strArr = str.Split(new string[] { " ", Environment.NewLine },StringSplitOptions.RemoveEmptyEntries);


Либо 
Код

            StreamReader sr = new StreamReader(@"C:\123.456");

            string str;
            string[] strArr;
            List<int> intList = new List<int>();

            while ((str = sr.ReadLine()) != null)
            {
                strArr = str.Split(' ');

                foreach (string s in strArr)
                {
                    try
                    {
                        intList.Add(int.Parse(s));
                    }
                    catch (FormatException)
                    { Console.WriteLine("Енто не число: " + s); }
                    catch (OverflowException)
                    { Console.WriteLine("Слишком большое число: " + s); }
                }
            }

            sr.Close();

            foreach (int i in intList)
            {
                Console.WriteLine(i);
            }


Это сообщение отредактировал(а) ivashkanet - 22.10.2006, 11:45
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 22.10.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Хы, можно тоже пример smile

Код
using System;
using System.IO;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string str = new StreamReader(@"c:\1.txt").ReadToEnd();
        List<int> result = new List<int>();
        Array.ForEach(str.Split(' '), delegate(string num)
        {
            result.Add(int.Parse(num));
        });
    }
}



--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 22.10.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



mr.DUDA, гы, неплоха так  smile 
P.S. Давно раскопал 
Цитата(mr.DUDA @  22.10.2006,  13:53 Найти цитируемый пост)
Array.ForEach
 ?

Добавлено @ 19:31 
mr.DUDA, ты бы еще от строки избавился:
Код

        List<int> result = new List<int>();
        Array.ForEach((new StreamReader(@"c:\1.txt").ReadToEnd()).Split(' '), delegate(string num)
        {
            result.Add(int.Parse(num));
        });

 smile 
PM MAIL WWW ICQ   Вверх
Void
Дата 22.10.2006, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Код
int[] result = Array.ConvertAll<string, int>(str.Split(' '), int.Parse);

К сожалению вывод типов хромает и приходится указывать аргументы дженерика.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
DarkDragon
Дата 22.10.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Ну а если заместо пробелов что то другое и может быть существуют символы возрата каретки, и переход на новую строку
то можно так:

Код

      public int[] nums;
      private ArrayList arrl;

      public void ConvNums (string path)
      {
            string strtmp;
            char[] chars;
            StreamReader sr = new StreamReader(path);
            string str = sr.ReadToEnd();
            chars = str.ToCharArray();
            sr.Close();
            arrl.Clear();
            for (int i = 0; i <= str.Length - 1; i++)
            {
               if (char.IsDigit (chars[i]) == true)
               {
                   strtmp += chars[i].ToString();
               }
               else if(char.IsDigit (chars[i]) == false | i == str.Length - 1)
               {
                   if (strtmp != null)arrl.Add (Convert.ToInt32 (strtmp));
                   strtmp = "";
               }
            }
            nums = arrl.ToArray (typeof(int));
      }


PM MAIL   Вверх
mr.DUDA
Дата 22.10.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Void @  22.10.2006,  19:34 Найти цитируемый пост)
int[] result = Array.ConvertAll<string, int>(str.Split(' '), int.Parse);

Void, как всегда, прав.

"Окончательный вариант"  smile:
Код
int[] result = Array.ConvertAll<string, int>(new StreamReader(@"c:\1.txt").ReadToEnd().Split(' '), int.Parse);


Цитата(DarkDragon @  22.10.2006,  22:47 Найти цитируемый пост)
Ну а если заместо пробелов что то другое и может быть существуют символы возрата каретки, и переход на новую строку то можно так:

Тогда имхо лучше поюзать Regex, там возможностей побольше и код выходит попроще.


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 23.10.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(DarkDragon @  22.10.2006,  22:47 Найти цитируемый пост)
Ну а если заместо пробелов что то другое и может быть существуют символы возрата каретки, и переход на новую строку

DarkDragon,  а чем тебе не нравится: 
Код
string[] strArr = str.Split(new string[] { " ", Environment.NewLine }
  smile 
Кроме того твой код пропустит отрицательное число 

PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 23.10.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  22.10.2006,  23:48 Найти цитируемый пост)
ReadToEnd().Split(' ')

Если исользовать ReadToEnd,  то сплитить нужно еще и по NewLine  smile 

Т.о.  "окончательный окончательный вариант":
Код
int[] result = Array.ConvertAll<string, int>(new StreamReader(@"c:\1.txt").ReadToEnd().Split(new string[] { " ", Environment.NewLine }), int.Parse);

 smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.