Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2019, 11:36   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от atztek Посмотреть сообщение
возвращает 8 вместо 2
И правильно. У вас же массив из 2х указателей по 4 байта.

Цитата:
Сообщение от atztek Посмотреть сообщение
Т.е. компилятор понимает что это стринг, а не одиночный символ.
Ну так вы ему указали правильный тип и дали строки. Магии нет тут.
p51x на форуме Ответить с цитированием
Старый 08.02.2019, 12:17   #12
atztek
Пользователь
 
Регистрация: 08.02.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну так вы ему указали правильный тип и дали строки. Магии нет тут.
Что обозначает звездочка '*' справа от 'char' ?
Как это называется и где можно об этом почитать? (как найти об этом информацию в гугле?)

Я в прошлом писал небольшие программки-скрипты в среде, основанной на Си, но некоторые вещи там были проще (например можно было пользоваться 'string'-ом вместо 'char' и т.д.).
atztek вне форума Ответить с цитированием
Старый 08.02.2019, 12:20   #13
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от atztek Посмотреть сообщение
Что обозначает звездочка '*' справа от 'char' ?
Как это называется и где можно об этом почитать? (как найти об этом информацию в гугле?)
https://ru.wikipedia.org/wiki/%D0%A3...BD%D1%8B%D1%85)
https://learnc.info/c/pointers.html
https://habr.com/en/post/251091/
http://www.helloworld.ru/texts/comp/...c2/book016.htm

Цитата:
Сообщение от atztek Посмотреть сообщение
Я в прошлом писал небольшие программки-скрипты в среде, основанной на Си, но некоторые вещи там были проще (например можно было пользоваться 'string'-ом вместо 'char' и т.д.).
Ну так если полезли в "дебри", то начинайте с основ.
p51x на форуме Ответить с цитированием
Старый 08.02.2019, 14:38   #14
atztek
Пользователь
 
Регистрация: 08.02.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Немного продвинулся вперед с кодом, но возникла проблема с чтением массива из файла.

Код:
#include <stdio.h>
#include <string.h>



char* a[2]      = {"130123456789", "2"};



int main(int argc, char* argv[]) {


	printf("\n a[0] = %s", a[0]);
	printf("\n a[1] = %s", a[1]);


// ====================================================

	FILE *file_01;

	if((file_01   = fopen("OUT_a.txt","w"))==NULL) {
		printf("CANNOT OPEN FILE OUT_a.txt 'w'\n");
		exit(1);
	};


	printf("\n strlen(a[0]) = %i", strlen(a[0]));
	printf("\n strlen(a[1]) = %i", strlen(a[1]));


	int t1 = fwrite(a, (strlen(a[0])+strlen(a[1])), 1, file_01);

	printf("\n t1 = %i", t1);

	fclose(file_01);

// ====================================================




// ====================================================

	if((file_01   = fopen("OUT_a.txt","r"))==NULL) {
		printf("CANNOT OPEN FILE OUT_a.txt 'r'\n");
		exit(1);
	};



	int x0 = sizeof(a)/sizeof(a[0]);
	printf("\n x0 = sizeof(a)/sizeof(a[0]) = %i \n", x0);

	char* b[x0];


	int k = fscanf(file_01, "%s", b);

	printf("\n k = %i \n", k);

	printf("\n sizeof(b)/sizeof(b[0]) = %i \n", (sizeof(b)/sizeof(b[0])));

	printf("\n strlen(b[0]) = %i", strlen(b[0]));
	printf("\n strlen(b[1]) = %i", strlen(b[1]));




	int x1;

	for(x1=0; x1<x0; x1++){
		printf("\n b[%i] = %c ", x1, b[x1]);
	}

	fclose(file_01);

// ====================================================


	printf("\n\nFINISH!\n");


	return 0;
}

Вот что получил в результате компиляции:

Цитата:
a[0] = 130123456789
a[1] = 2
strlen(a[0]) = 12
strlen(a[1]) = 1
t1 = 1
x0 = sizeof(a)/sizeof(a[0]) = 2

k = 1

sizeof(b)/sizeof(b[0]) = 2

strlen(b[0]) = 12
strlen(b[1]) = 1
b[0] = 4
b[1] = A <<<=== ВОТ НА ЭТОМ ЭТАПЕ ЧТО-ТО ПОШЛО НЕ ТАК

FINISH!

- Пожалуйста подскажите что я сделал неверно?
- Содержимое файла "OUT_a.txt" выглядит так:

Цитата:
@@
@@ Ъ Ъ
Почему не в текстовом формате?
atztek вне форума Ответить с цитированием
Старый 08.02.2019, 14:51   #15
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от atztek Посмотреть сообщение
int t1 = fwrite(a, (strlen(a[0])+strlen(a[1])), 1, file_01);
Что это ? Размер а не strlen(a[0])+strlen(a[1]), а 8 байт. Вы же сами постом выше об этом писали. Пишите строки отдельно.

Цитата:
Сообщение от atztek Посмотреть сообщение
char* b[x0];
Указатели сами память не выделяют. Более того локальные переменные не инициализируются. Куда вы пишите?

Цитата:
Сообщение от atztek Посмотреть сообщение
int k = fscanf(file_01, "%s", b);
В теории - у вас записаны две строки. Почему вы читаете одну? Почему поверх массива указателей?

Цитата:
Сообщение от atztek Посмотреть сообщение
b[1] = A <<<=== ВОТ НА ЭТОМ ЭТАПЕ ЧТО-ТО ПОШЛО НЕ ТАК
Цитата:
Сообщение от atztek Посмотреть сообщение
printf("\n b[%i] = %c ", x1, b[x1]);
b[i] это же строки, а вы пытаетесь один символ вывести
p51x на форуме Ответить с цитированием
Старый 08.02.2019, 15:23   #16
atztek
Пользователь
 
Регистрация: 08.02.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Указатели сами память не выделяют. Более того локальные переменные не инициализируются. Куда вы пишите?
Т.е. массив b[] необходимо создать одновременно с массивом a[] ?
Как можно узнать сколько памяти потребуется массиву b[] до того как он будет прочтен из файла? - в этой программе я могу использовать размер массива a[], но в будущем мне возможно придется считывать значения массива a[] из файла, который может быть создан вручную, т.е. заранее о нем не будет никакой информации.

Цитата:
Сообщение от p51x Посмотреть сообщение
Указатели сами память не выделяют.
Память выделяется при помощи malloc ? - где-то встречал эту функцию, но пока с ней не работал.



Цитата:
Сообщение от p51x Посмотреть сообщение
Пишите строки отдельно.
Т.е. сохранять значения не всего массива сразу, по поэлементно - сначала a[0], а затем a[1] ?


Цитата:
Сообщение от p51x Посмотреть сообщение
b[i] это же строки, а вы пытаетесь один символ вывести
Это осталось от прошлого варианта, я тогда пытался использовать %s, но не прошло. Сейчас исправил.
atztek вне форума Ответить с цитированием
Старый 08.02.2019, 15:33   #17
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от atztek Посмотреть сообщение
Т.е. массив b[] необходимо создать одновременно с массивом a[] ?
Если компилятор поддерживает блолее-менее новый стандарт, то нет. У вас же не ругается сейчас на это.

Цитата:
Сообщение от atztek Посмотреть сообщение
Как можно узнать сколько памяти потребуется массиву b[] до того как он будет прочтен из файла?
Сие есть веселая задача. Можно ограничить размер строки изначально. Можно выделить кусок памяти и при нехватке перевыделять.

Цитата:
Сообщение от atztek Посмотреть сообщение
Память выделяется при помощи malloc ? - где-то встречал эту функцию, но пока с ней не работал.
https://en.wikipedia.org/wiki/C_dyna...ory_allocation
Их там семейство с небольшими отличаями.

Цитата:
Сообщение от atztek Посмотреть сообщение
Т.е. сохранять значения не всего массива сразу, по поэлементно - сначала a[0], а затем a[1] ?
Ну вы же по ссылками сходили, почитали? Осознали, что массив у вас фактически состоит из двух чисел, которые "равны" номерам ячеек в памяти и никто не гарантирует, что они лежат непрерывно... Конечно, никто вам немешает вместо b вообще зависти один указатель с памятью для двух строк и играться.
p51x на форуме Ответить с цитированием
Старый 08.02.2019, 16:41   #18
atztek
Пользователь
 
Регистрация: 08.02.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Если компилятор поддерживает блолее-менее новый стандарт, то нет. У вас же не ругается сейчас на это.
Если я Вас правильно понял, Вы имели в виду что у меня массив b[] создан неправильно?

- - -

Исправил строку:
Код:
	int t1 = fwrite(a, sizeof(a), 1, file_01);
Но один вопрос с файлом остался - почему значения сохраняются в бинарном(?), а не текстовом формате? - я файл открывал с флагом "w", который вроде подразумевает текст?

Последний раз редактировалось atztek; 08.02.2019 в 16:53.
atztek вне форума Ответить с цитированием
Старый 08.02.2019, 17:17   #19
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Перечитайте еще раз последний абзац моего предыдущего поста. Вы в файл записали два числа, типа 0x23F61290 0x1123EDAC.
p51x на форуме Ответить с цитированием
Старый 08.02.2019, 17:23   #20
atztek
Пользователь
 
Регистрация: 08.02.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Перечитайте еще раз последний абзац моего предыдущего поста. Вы в файл записали два числа, типа 0x23F61290 0x1123EDAC.
Цитата:
Сообщение от p51x Посмотреть сообщение
массив у вас фактически состоит из двух чисел, которые "равны" номерам ячеек в памяти
Уфф, для меня это темный лес. Вы имеете в виду что в массиве хранится не текст, а информация о номерах ячеек в памяти компьютера, в которых хранится текст?
atztek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с выводом массива arduinhsik Помощь студентам 0 09.12.2018 01:12
Ошибка при выводе строкового массива Bugrimov Общие вопросы C/C++ 25 02.04.2012 22:40
Считывание данных из строкового массива exe NiKiToZZ- Помощь студентам 0 08.01.2011 18:21
Сортировка строкового массива Vikenty Помощь студентам 2 24.05.2010 00:06
проблема с выводом элемента из массива kirosin JavaScript, Ajax 4 15.01.2010 23:35