Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29

Разобраться с ошибкой чтения из файла

11.04.2017, 16:57. Показов 2701. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какого черта при переборе строк в классе файл
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace Course_work
{
    public class File
    {
        string pathRead;
        string pathWrite;
        string h;
        int n;
        int length;
        double[] inputDataT;
        double[] outputDataT;
 
        public File(string PathRead, string PathWrite, int N)
        {
            pathRead = PathRead;
            pathWrite = PathWrite;
            n = N;
            GetInputData();
            if (n == 1)
                GetArithData();
            else
                GetSquareData();
            OutputFile();
        }
 
        public double[] InputDataT { get { return inputDataT; } }
        public double[] OutputDataT { get { return outputDataT; } }
 
        private void GetInputData()
        {
            FileStream fs = new FileStream(pathRead, FileMode.Open);
            StreamReader sr = new StreamReader(fs);
            if (int.TryParse(sr.ReadLine(), out length))
            {
                if (length > 2)
                {
                    h = sr.ReadLine();
                    inputDataT = new double[length];
                    try
                    {
                        for (int i = 0; i < length; i++)
                        {
                            double dataT;
                            if (double.TryParse(ConvertSep(sr.ReadLine().Split('\t')[1]), out dataT))
                            {
                                inputDataT[i] = dataT;
                            }
                            else
                            {
                                sr.Close();
                                fs.Close();
                                throw new Exception("В " + (i + 1) + " строке содержится ошибка.");
                            }
                        }
                        for (int i = 0; i < length; i++)
                        {
                            if (inputDataT[i] < 0)
                            {
                                sr.Close();
                                fs.Close();
                                throw new Exception("В массиве присутствуют отрицательные значения t.");
                            }
                        }
                    }
                    catch (EndOfStreamException)
                    {
                        sr.Close();
                        fs.Close();
                        throw new Exception("Количество измерений, указанное в файле, неверно.");
                    }
                    sr.Close();
                    fs.Close();
                }
                else
                    throw new Exception("Входной массив должен содержать, по крайней мере, 3 точки.");
            }
            else
                throw new Exception("Неверный формат количества измерений в файле.");
        }
 
        private void GetArithData()
        {
            outputDataT = new double[length];
            outputDataT[1] = inputDataT[1];
            outputDataT[length] = inputDataT[length];
            for (int i = 2; i < length - 1; i++)
            {
                outputDataT[i] = (inputDataT[i - 1] + inputDataT[i] + inputDataT[i + 1]) / 3;
            }
 
        }
 
        private void GetSquareData()
        {
            outputDataT = new double[length];
            outputDataT[1] = inputDataT[1];
            outputDataT[length] = inputDataT[length];
            for (int i = 2; i < length - 1; i++)
            {
                outputDataT[i] = Math.Sqrt((inputDataT[i - 1] + inputDataT[i] + inputDataT[i + 1]) / 3);
            }
 
        }
 
        private void OutputFile()
        {
            FileStream fs = new FileStream(pathWrite, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine("Количество строк: " + length);
            sw.WriteLine("Номер\tX\tt\tСглаженный");
            for (int i = 0; i < length; i++)
            {
                sw.WriteLine((i + 1).ToString() + "  " + Math.Round(inputDataT[i], 2).ToString() + "  " + Math.Round(outputDataT[i], 2).ToString());
            }
            sw.Close();
            fs.Close();
        }
 
 
        private string ConvertSep(string line)
        {
            if (System.Threading.Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator[0] == '.')
                return line.Replace(',', '.');
            return line.Replace('.', ',');
        }
 
    }
}
у меня вылезает ошибка, что во второй строке у меня содержится ошибка? вот пример файла входных данных
C#
1
2
3
4
5
6
7
8
9
10
8
x   t
0   0
5   11.61
10  29.62
12  46.28
-3  3.8
20  52.59
18.23   57.09
30  60.24
По сути, у меня сначала считывается вначале первая строчка с количеством измерений (строк), затем переменная h считывает заголовки колонок, а уже в цикле в массив считываются данные из второй колонки. Почему же вылезает ошибка: В 2 строчке есть ошибка.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2017, 16:57
Ответы с готовыми решениями:

Не могу разобраться с ошибкой CS1955
Здравствуйте у меня в коде ошибка помогите вот код using System; using System.Collections.Generic; using System.Linq; using...

Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
Здравствуйте, задача такова есть файл, размером 1000 байт, нужно открыть его считать 100 байт, после чтения закрыть. Потом опять открыть...

Разобраться с ошибкой
Когда компилирую появляется вот такая ошибка.

21
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
11.04.2017, 17:10
Цитата Сообщение от Rapax Посмотреть сообщение
Почему же вылезает ошибка: В 2 строчке есть ошибка.
ну может потому, что символ t не может быть приведён к числу double?
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 17:17  [ТС]
aquaMakc, но я же перешел на новую строчку, разве нет?
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
11.04.2017, 17:20
Цитата Сообщение от Rapax Посмотреть сообщение
Почему же вылезает ошибка: В 2 строчке есть ошибка.
если заменить символ точки на запятую в файле ошибка будет?
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 17:34  [ТС]
FateOri, ну я вроде это предусмотрел в
C#
1
private string ConvertSep(string line)
Добавлено через 12 минут
есть у кого какие-то мысли?) если кто-то задумку понимает, можете предложить альтернативный вариант?)
0
7 / 7 / 4
Регистрация: 03.12.2015
Сообщений: 51
11.04.2017, 17:52
я так понял x И t -это название столбцов? значит они будут всегда на второй строчке и в каждом файле. я бы считал первую строку потом переход на третью строку и начиная с третьей считывал бы все что написано дальше. Если в них нет острой необходимости, то убрал бы их за ненадобностью.

Не по теме:

И еще вместо кучи if, я бы использовал конструкцию try catch

0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 17:57  [ТС]
GyJ1uBeP, да, это названия столбцов.
Цитата Сообщение от GyJ1uBeP Посмотреть сообщение
я бы считал первую строку потом переход на третью строку и начиная с третьей считывал бы все что написано дальше.
А разве у меня не так?
C#
1
if (int.TryParse(sr.ReadLine(), out length))
перешли на вторую строчку
C#
1
h = sr.ReadLine();
а здесь на третью
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
11.04.2017, 18:05
40я строка
C#
1
           if (!int.TryParse(sr.ReadLine(), out length))
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 18:06  [ТС]
Diamante, что не так?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
11.04.2017, 18:10
стоп, сорри, не туда глянул
0
7 / 7 / 4
Регистрация: 03.12.2015
Сообщений: 51
11.04.2017, 18:12
Да ты прав не заметил второй переход. Проверь как в строке с ошибкой выглядит запись чисел между ними табуляция или пробелы? не проще разделять числа символом "|" например.
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
11.04.2017, 18:16
а в файле точно разделитель табуляция? или все же пробел? вот тут значится пробел - Вытащить числа из первого столбца в .txt файле
1
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 18:29  [ТС]
Diamante, GyJ1uBeP, да, извините ребята... я туплю жестко в входном файле у меня была табуляция, поставил сейчас пробелы, прошло дальше, но теперь всплывает ошибка index was outside the bounds of the array. Я сейчас с ума сойду

Добавлено через 8 минут
C#
1
 if ((double.TryParse(ConvertSep(sr.ReadLine().Split(' ', '\t')[0]), out dataX)) && (double.TryParse(ConvertSep(sr.ReadLine().Split(' ', '\t')[1]), out dataT)))
я же вроде в файле предусмотрел и пробел, и табуляцию, разве нет?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
11.04.2017, 18:31
92 строка, length-1
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 18:32  [ТС]
Diamante,
C#
1
2
outputDataT[1] = inputDataT[1];
            outputDataT[length] = inputDataT[length];
а что с ними?
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
11.04.2017, 18:35
что бы и то и то, и надежно,
C#
1
.Split(new char[]{' ','\t'},StringSplitOptions.RemoveEmptyEntries)
- проверь синтаксис в студии, пишу сразу на форуме

Добавлено через 1 минуту
тут ты 1й(не нулевой, а первый) эл-т одного массива приравниваешь к другому, а дальше, судя по всему, последний хочешь так же, но последний это length-1
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 18:42  [ТС]
Diamante,
C#
1
2
3
4
5
6
7
8
9
double dataX;
                            double dataT;
                            if ((double.TryParse(ConvertSep(sr.ReadLine().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries)
[0]), out dataX)) && (double.TryParse(ConvertSep(sr.ReadLine().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries)
[1]), out dataT)))
                            {
                                inputDataX[i] = dataX;
                                inputDataT[i] = dataT;
                            }
в этом случае выдает ошибку в 1 значении

Добавлено через 26 секунд
Цитата Сообщение от Diamante Посмотреть сообщение
тут ты 1й(не нулевой, а первый) эл-т одного массива приравниваешь к другому, а дальше, судя по всему, последний хочешь так же, но последний это length-1
исправил
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
11.04.2017, 18:48
во блин
короче
C#
1
2
string[] str = sr.ReadLine().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
double.TryParse(convertsep(str[0]),out ...);
ну и далее по списку

Добавлено через 1 минуту
там же, в цикле иначе ты на каждый tryparse новую строку читаешь
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 29
11.04.2017, 19:13  [ТС]
вот полный класс File
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace Course_work
{
    public class File
    {
        string pathRead;
        string pathWrite;
        int n;
        int length;
        double[] inputDataX;
        double[] inputDataT;
        double[] outputDataT;
 
        public File(string PathRead, string PathWrite, int N)
        {
            pathRead = PathRead;
            pathWrite = PathWrite;
            n = N;
            GetInputData();
            if (n == 1)
                GetArithData();
            else
                GetSquareData();
            OutputFile();
        }
 
        public double[] InputDataX { get { return inputDataT; } }
        public double[] InputDataT { get { return inputDataT; } }
        public double[] OutputDataT { get { return outputDataT; } }
 
        private void GetInputData()
        {
            FileStream fs = new FileStream(pathRead, FileMode.Open);
            StreamReader sr = new StreamReader(fs);
            if (int.TryParse(sr.ReadLine(), out length))
            {
                if (length > 2)
                {
                    sr.ReadLine();
                    inputDataT = new double[length];
                    try
                    {
                        for (int i = 0; i < length; i++)
                        {
                            double dataX;
                            double dataT;
                            string[] str = sr.ReadLine().Split(new char[] { ' ', '\t', ';' }, StringSplitOptions.RemoveEmptyEntries);
                            if (double.TryParse(ConvertSep(str[0]), out dataX) && (double.TryParse(ConvertSep(str[1]), out dataT)))
                            {
                                inputDataX[i] = dataX;
                                inputDataT[i] = dataT;
                            }
                            else
                            {
                                sr.Close();
                                fs.Close();
                                throw new Exception("В " + (i + 1) + " строке содержится ошибка.");
                            }
                        }
                        for (int i = 0; i < length; i++)
                        {
                            if (inputDataT[i] < 0)
                            {
                                sr.Close();
                                fs.Close();
                                throw new Exception("В массиве присутствуют отрицательные значения t.");
                            }
                        }
                    }
                    catch (EndOfStreamException)
                    {
                        sr.Close();
                        fs.Close();
                        throw new Exception("Количество измерений, указанное в файле, неверно.");
                    }
                    sr.Close();
                    fs.Close();
                }
                else
                    throw new Exception("Входной массив должен содержать, по крайней мере, 3 точки.");
            }
            else
                throw new Exception("Неверный формат количества измерений в файле.");
        }
 
        private void GetArithData()
        {
            outputDataT = new double[length];
            outputDataT[0] = inputDataT[0];
            outputDataT[length-1] = inputDataT[length-1];
            for (int i = 1; i < length - 2; i++)
            {
                outputDataT[i] = (inputDataT[i - 1] + inputDataT[i] + inputDataT[i + 1]) / 3;
            }
 
        }
 
        private void GetSquareData()
        {
            outputDataT = new double[length];
            outputDataT[0] = inputDataT[0];
            outputDataT[length-1] = inputDataT[length-1];
            for (int i = 1; i < length - 2; i++)
            {
                outputDataT[i] = Math.Sqrt((inputDataT[i - 1] + inputDataT[i] + inputDataT[i + 1]) / 3);
            }
 
        }
 
        private void OutputFile()
        {
            FileStream fs = new FileStream(pathWrite, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine("Количество строк: " + length);
            sw.WriteLine("Номер\tX\tt\tСглаженный");
            for (int i = 0; i < length; i++)
            {
                sw.WriteLine((i + 1).ToString() + "  " + Math.Round(inputDataX[i], 2).ToString() + "  " + Math.Round(inputDataT[i], 2).ToString() + "  " + Math.Round(outputDataT[i], 2).ToString());
            }
            sw.Close();
            fs.Close();
        }
 
 
        private string ConvertSep(string line)
        {
            if (System.Threading.Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator[0] == '.')
                return line.Replace(',', '.');
            return line.Replace('.', ',');
        }
 
    }
}
Diamante,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                        for (int i = 0; i < length; i++)
                        {
                            double dataX;
                            double dataT;
                            string[] str = sr.ReadLine().Split(new char[] { ' ', '\t', ';' }, StringSplitOptions.RemoveEmptyEntries);
                            if (double.TryParse(ConvertSep(str[0]), out dataX) && (double.TryParse(ConvertSep(str[1]), out dataT)))
                            {
                                inputDataX[i] = dataX;
                                inputDataT[i] = dataT;
                            }
                            else
                            {
                                sr.Close();
                                fs.Close();
                                throw new Exception("В " + (i + 1) + " строке содержится ошибка.");
                            }
                        }
вот что у меня получилось. Но теперь вылетает ошибка Object reference not set to an instance of an object
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
11.04.2017, 19:23
Rapax, не изобретай велосипед используй сериализацию/десериализацию и никаких проблем не будет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2017, 19:23
Помогаю со студенческими работами здесь

разобраться с ошибкой
x = linspace(-2,0.01,2); y = linspace(-3,0.02,3); =meshgrid(x,y); Z = (exp(-y.*x).*sin(2.*x))./(abs(3.*y)+(2.*x)+5); mesh(X,Y,Z)

Не могу разобраться с ошибкой
Программа ханойские башни, нужно что бы выводил графически. Но пишет вот такую ошибку Ошибка 1 error C1083: Не удается открыть файл...

Как разобраться с ошибкой
Только начинаю знакомство с ардуиной, и у меня проблема при загрузки скетча. Начну сначала. первый раз подключил ардуину загрузил тестовый...

Ошибка компиляции "undefined symbol : scrlin"
TITLE ALGLIN (EXE) ; вызов программы ;---------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' ...

Не могу разобраться с ошибкой!
Выводит ошибку в этом коде на 5й строке. procedure TForm1.Button4Click(Sender: TObject); label 200; begin for i:=n downto 230 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru