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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не получается прочитать строки(int) из файла, и поместить их в массив 
V
    Опции темы
Warchief
Дата 21.4.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ребят, вот просто решил написать простенькую "прогу", но не могу побороть простую ошибку.

Задача:

прочитать файл в котором содержатся только числа(одно число на строчку), эти самые числа  нужно потом записать в массив(кол-во строк в файле зарание не известно). Я делаю так: сначала считаю кол-во строк в файле и создаю массив с этим размером. потом читаю файл ещё раз построчно и записываю данные в массив, но почемуто первая строка в нём не появляется  smile , а только со второй, да ещё последний элемент всегда 0  smile 

помогите пожалуйста найти ошибку.
вот код:

Код

using System;
using System.IO;

namespace s11._a
{

    public class Input
    {
        static void Main(string[] args)
        {
            int counter = 0;
            string filename = "otput.txt";
            string filename1 = "input.txt";
           



            foreach (string arg in args) // считает строки
            {
                Console.WriteLine("==>{0}", arg);
                try
                {
                    TextReader tr = (TextReader)File.OpenText(arg);
                    string ln = tr.ReadLine();
                    while (ln != null)
                    {
                        counter++;
                        ln = tr.ReadLine();
                    }
                    tr.Close();
                    Console.WriteLine(counter);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: no such file or file can not be open");
                }
            }


            int[] array1 = new int[counter]; //тут создаём массив
           
            //foreach (string arg in filename1) // пытаемся наполнить массив
           //{
                Console.WriteLine("Filling array with int's from " + filename1);
                try
                {
                    TextReader tr1 = (TextReader)File.OpenText(filename1);
                    int ii=0;
                    string ln = tr1.ReadLine();
                    string tmp = "";
                    int ia = 0;
                    while ((tmp = tr1.ReadLine()) != null)//Вот тут как раз и происходит считывание построчно, и тут-же видимо ошибка.
                    {
                        int.TryParse(tmp, out ii); //string to int
                             array1[ia] = ii;
                             ia++;
                    }
                    tr1.Close();
                    Console.WriteLine("done");
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: no such file or file can not be open");
                    Console.ReadKey();
                }

           // }



            foreach (int ee in array1) // для проверки содержимого массива
            {
                Console.WriteLine(ee);
            }
        }
    }
}
 



Это сообщение отредактировал(а) Warchief - 21.4.2008, 00:54
PM MAIL ICQ Skype   Вверх
giologi
Дата 21.4.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пробуй заместь TryParse использовать Convert
PM MAIL   Вверх
QryStaL
Дата 21.4.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

Репутация: 14
Всего: 32



Алгоритм совершенно неоптимален.

Во-первых, размер массива заранее знать необязательно. Используй коллекцию List<int> и динамически добавляй в нее элементы.
Тогда избавишься от чтения файла дважды.

Во-вторых, зачем нужна 49 строка? ты в нее походу 1-й элемент и читаешь, а затем нигде не используешь.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
mullih
Дата 21.4.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Коменты внутри
Код



using System;
using System.IO;
namespace s11._a
{
    public class Input
    {
        static void Main(string[] args)
        {
            int counter = 0;
            string filename = "output.txt";
            string filename1 = "input.txt";

            //зачем пробегаетесь по аргументам?
            //foreach (string arg in args) // считает строки
            //{
                //Console.WriteLine("==>{0}", args);
                try
                {
                    TextReader tr = (TextReader)File.OpenText(filename1);//имя файла уже указанно
                    string ln = tr.ReadLine();
                    while (ln != null)
                    {
                        counter++;
                        ln = tr.ReadLine();
                    }
                    tr.Close();
                    Console.WriteLine(counter);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: no such file or file can not be open");
                }
            //}
            int[] array1 = new int[counter]; //тут создаём массив

            //foreach (string arg in filename1) // пытаемся наполнить массив
            //{
            Console.WriteLine("Filling array with int's from " + filename1);
            try
            {
                TextReader tr1 = (TextReader)File.OpenText(filename1);
                int ii = 0;
                string ln = tr1.ReadLine();//прочитал первую строку
                string tmp = "";
                int ia = 0;
                while ((tmp = tr1.ReadLine()) != null)//Вот тут как раз и происходит считывание построчно, и тут-же видимо ошибка.
                    //тут уже прочитал вторую строку
                    //естественно вторую строку записал в первый элемент а последний будет всегда по дефолту 0
                {
                    int.TryParse(tmp, out ii); //string to int
                    array1[ia] = ii;
                    ia++;
                }
                tr1.Close();
                Console.WriteLine("done");
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: no such file or file can not be open");
                Console.ReadKey();
            }
            // }
            foreach (int ee in array1) // для проверки содержимого массива
            {
                Console.WriteLine(ee);
            }
        }
    }
}



предлагаю свою альтарнативу еси интересно
Код


using System;
using System.Collections.Generic;
using System.IO;
namespace s11._a
{
    public class Input
    {
        static void Main(string[] args)
        {
            string filename = "input.txt";

            List<int> list = new List<int>();

            try
            {
                TextReader tr = (TextReader)File.OpenText(filename);
                string ln = "";
                while ((ln = tr.ReadLine()) != null)
                {
                    try
                    {
                        list.Add(int.Parse(ln));
                    }
                    catch (Exception e)
                    {
                        System.Console.WriteLine("Строка не число");
                    }
                }
                tr.Close();

            }
            catch (Exception e)
            {
                Console.WriteLine("Error: no such file or file can not be open");
            }

            //если необходим именно массив и не устраивает список
            int[] array1 = list.ToArray();

        }
    }
}


PM MAIL WWW Skype   Вверх
Warchief
Дата 21.4.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо ребята, просто это моя первая встреча с C#  smile 
PM MAIL ICQ Skype   Вверх
QryStaL
Дата 21.4.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

Репутация: 14
Всего: 32



Warchief, обращайся =)


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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