Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
iTD
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 29
1

По символьному файлу с программой на языке С создать новый файл c именами всех многомерных массивов

22.03.2012, 23:57. Просмотров 2797. Ответов 34
Метки нет (Все метки)

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
/* Во всех программах использовать функции fopen(), fclose(), fgets() !
   По символьному файлу с программой на языке С создать новый файл c
    именами всех многомерных массивов. */
 
#include <conio.h>
#include <stdio.h>
#include <string.h>
 
#define LENGTH 100
 
void main ()
{
    FILE *in;
    char string[LENGTH];
    char words[LENGTH];
    char *word;
    int k=0, a=0;
 
    if ((in = fopen("L9.txt", "r") ) == NULL)
    {
        puts("ERROR");
        getch();
    }
    else
    {
        while (!feof(in))
        {
            fgets(string, LENGTH, in);
            word = strtok (string, " ");
            while (word != NULL)
            {
                while (word[a]!='\0')
                {
                    if(word[a]==']' && word[a+1]=='[')
                    {
                        for(int b=0; word[b]!='['; b++,k++)
                            words[k]=word[b];
                        k++;
                        words[k]=' ';
                        break;
                    }
                    a++;
                }
 
                word = strtok (NULL, " ");
                a=0;
            }
        }
        words[k]='\0';
    }
    fclose(in);
    if((in = fopen("L9_2.txt", "w")) == NULL)
        puts("ERROR");
    else
        fprintf(in, "%s", words);
    fclose(in);
}
Не могу понять откуда берется мусор в массиве words (туда я записываю имена всех многомерных массивов из файла L9.txt)
Друзья, как можно избавится от этого ?

Заранее благодарю !
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2012, 23:57
Ответы с готовыми решениями:

По файлу с программой на языке С выполнить все директивы #include (могут быть вложены)
Есть три файла: soft.cpp: #include &quot;test1.h&quot; int main (void) { funct();...

Отформатировать файл с программой на языке С
Задача: Отформатировать файл с программой на языке С. Проблема: не могу...

Приложение представляющее организацию многомерных вычислений многомерных массивов
Разработать приложение для Windows, представляющую организацию многомерных...

Создать новый файл D из чисел, которые встречаются во всех трех файлах
Решить на С++, с комментариями. Спасибо:) Даны три файла: А,В,С из целых...

Создать новый файл D из чисел, которые встречаются во всех трех файлах
const Length: word = 10; MinRange: integer = -25; MaxRange: integer = 25;...

34
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
23.03.2012, 00:57 2
'k' не переинициализируетс?
2
NightCoder89
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
23.03.2012, 01:10 3
Проверьте этот участок дебагером, что именно записывается в массив.

C
1
2
3
4
5
6
7
8
if(word[a]==']' && word[a+1]=='[')
{
      for(int b=0; word[b]!='['; b++,k++)
               words[k]=word[b];
      k++;
      words[k]=' ';
      break;
 }
1
p_r_a_g_m_a
110 / 62 / 23
Регистрация: 08.03.2012
Сообщений: 211
Завершенные тесты: 1
23.03.2012, 01:38 4
А где собсно выделение памяти для char *word; ?
1
NightCoder89
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
23.03.2012, 01:46 5
p_r_a_g_m_a, кажись в 29 строчке
0
silent_1991
Эксперт С++
5013 / 3073 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
23.03.2012, 12:26 6
NightCoder89, strtok память не выделяет. После strtok word просто будет указывать на начало очередного слова в строке string.
2
NightCoder89
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
23.03.2012, 14:12 7
Тогда причина мусора в массиве найдена, это char *word .
2
wind_mill
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 45
23.03.2012, 14:55 8
приеду домой, опробую
0
iTD
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 29
23.03.2012, 19:51  [ТС] 9
все равно при записи из массива words в файл вылезают кракозябры
0
KATbIK
86 / 81 / 28
Регистрация: 02.08.2011
Сообщений: 335
23.03.2012, 19:57 10
Узнать бы как твой L9.txt выглядит, а так кто вас учит void main писать?? Дай в лоб ему
0
NightCoder89
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
23.03.2012, 19:57 11
iTD, посмотрите мой первый пост, я думаю, что крякозяблики идут в массив именно в этом участке кода.
0
iTD
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 29
23.03.2012, 19:59  [ТС] 12
L9.txt

#include <conio.h>
#include <stdio.h>

#define N 3

void main (void)
{
int m;
int a[N];
int b[N][N]; // massiv !
int c[N][N][N];
char m1;
char a1[N];
char b1[N][N];
char c1[N][N][N];
/* operators
...
...
...
...
...
...
operators */
getch();
}
0
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
23.03.2012, 20:15 13
silent_1991, вот кстати забавно, давно как-то думал над этим.
тогда каким образом отработает следующая операция?
C
1
2
3
word = strtok (string, " ");
strlen(word);
...
не будет же он искать длину от word до конца строки
0
silent_1991
Эксперт С++
5013 / 3073 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
23.03.2012, 20:23 14
OstapBender, strtok заменяет найденный разделитель на '\0' и выдаёт указатель на начало слова, расположенного непосредственно перед заменённым разделителем. Вот strlen и отрабатывает до появившегося в строке на месте разделителя нуль-терминатора.
1
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
23.03.2012, 20:28 15
silent_1991, а потом, чтоли обратно его заменяет на букву, чтобы строка не портилась?
0
silent_1991
Эксперт С++
5013 / 3073 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
23.03.2012, 20:28 16
OstapBender, нет, ничего он обратно не заменяет. Он банально портит строку. Поэтому применять его не рекомендуется.
1
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
23.03.2012, 20:50 17
silent_1991, надо же, за многие использования strtok-а не замечал данной особенности.
0
iTD
0 / 0 / 0
Регистрация: 14.03.2012
Сообщений: 29
24.03.2012, 01:11  [ТС] 18
NightCoder89, в 1 строке string из файла по мимо символов содержится и мусор, но как он попадает в массив words не понятно Там же условие стоит для многомерного массива, т.е. кроме названия многомерного массива в words ничего попадать не должно.

интересно что бы не присваивал words[k+1] на его месте появляется мусор
C
1
2
 k++;
 words[k]=' '; //пробел для того чтобы названия многомерных массивов отделить друг от друга
всю голову сломал ...

Добавлено через 4 минуты
C
1
2
k++;
 words[k]=' ';
хм... если убрать эти две строчки, то кракозябры пропадают, но названия массивов в файле не отделены друг от друга
может быть я присваиваю пробел как то не правильно ?
0
NightCoder89
12 / 12 / 1
Регистрация: 22.03.2012
Сообщений: 42
24.03.2012, 01:21 19
может быть я присваиваю пробел как то не правильно ?
Как вариант, можно вместо
Код
words[k]=' ';
Воспользоватся ASCII Table
Код
words[k]=32;
0
silent_1991
Эксперт С++
5013 / 3073 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
24.03.2012, 10:51 20
NightCoder89, конечно, присваивая магическое число вместо явного символа меньше вероятность ошибиться...
iTD, я в коде не разбирался, но есть предположение, что вы можете затирать этими строками нуль-терминатор, отсюда и мусор. Может такое быть в вашем алгоритме?
0
24.03.2012, 10:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2012, 10:51

Создать новый файл, содержащий квадраты всех элементов исходного файла
Дан текстовый файл вещественных чисел. Создать новый файл, содержащий квадраты...

15. В файле записаны числа. Создать новый файл, содержащий длины всех убывающих последовательностей
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; using namespace...

Отформатировать файл с программой на языке С
Отформатировать файл с программой на языке С. ( вложенные циклы, if_else)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru