» Вопросы по программированию на C/С++
GeMir
верю, только что тогда о мамонте спрашиваешь?
говорю ж: в литературе на "мамонта наступи"...
ссылка на
"Байков В. Д., Селютин С. А., Вычисление элементарных функций в ЭКВМ, Москва, Радио и связь, 1982, 64 стр."
верю, только что тогда о мамонте спрашиваешь?
говорю ж: в литературе на "мамонта наступи"...
ссылка на
"Байков В. Д., Селютин С. А., Вычисление элементарных функций в ЭКВМ, Москва, Радио и связь, 1982, 64 стр."
[more] [more] Здравствуйте.
Есть библиотека, которую подключаю к программе на с++
(http://forum.ru-board.com/topic.cgi?forum=33&topic=4836&start=606&limit=1&m=1#1).
Из этой библиотеки делаю импорт структуры и процедуры.
Программу создавал как "пустой проект", выглядит она так:
//****************************
#include <iostream>
#pragma comment(lib,"fdll.lib")
using namespace std;
Extern "C" {
extern __declspec(dllimport) struct variables { double a; } abc;
void F();
}
int main()
{
F();
std::cout<<abc.a;
return 0;
}
//***************************
Это её рабочий вариант, т.е. в качестве _консольного_ приложения она корректно работает, не выдает предупреждений при сборке.
Теперь встала проблема использовать структуру и функция в приложении типа Windows Forms.
Создаю стандартное приложение Windows Forms, не изменяя пробую запустить - всё Ок, работает.
Теперь хочу глобально объявить мою структуру из библиотеки и процедуру от туда же.
Пишу строчки (которые, как замечу, в консольном приложении работаю):
#pragma comment(lib,"fdll.lib")
Extern "C" {
extern __declspec(dllimport) struct variables { double a; } abc;
void F();
}
Добавляю их в главный файл .cpp, до функции main().
При сборке получаю предупреждение вида:
warning C4394: abc: символ для каждого домена приложений не следует помечать с помощью __declspec(dllimport)
соответственно при попытке использования импортированной структуры и процедуры - ошибки.
прошу подсказки, в чем дело? почему в консольном приложении работает как положено, а в Windows Forms нет, при том что
располагаю объявление структуры, как мне кажется, в одном и том же месте... MS VS 2008
[/more] [/more]
Есть библиотека, которую подключаю к программе на с++
(http://forum.ru-board.com/topic.cgi?forum=33&topic=4836&start=606&limit=1&m=1#1).
Из этой библиотеки делаю импорт структуры и процедуры.
Программу создавал как "пустой проект", выглядит она так:
//****************************
#include <iostream>
#pragma comment(lib,"fdll.lib")
using namespace std;
Extern "C" {
extern __declspec(dllimport) struct variables { double a; } abc;
void F();
}
int main()
{
F();
std::cout<<abc.a;
return 0;
}
//***************************
Это её рабочий вариант, т.е. в качестве _консольного_ приложения она корректно работает, не выдает предупреждений при сборке.
Теперь встала проблема использовать структуру и функция в приложении типа Windows Forms.
Создаю стандартное приложение Windows Forms, не изменяя пробую запустить - всё Ок, работает.
Теперь хочу глобально объявить мою структуру из библиотеки и процедуру от туда же.
Пишу строчки (которые, как замечу, в консольном приложении работаю):
#pragma comment(lib,"fdll.lib")
Extern "C" {
extern __declspec(dllimport) struct variables { double a; } abc;
void F();
}
Добавляю их в главный файл .cpp, до функции main().
При сборке получаю предупреждение вида:
warning C4394: abc: символ для каждого домена приложений не следует помечать с помощью __declspec(dllimport)
соответственно при попытке использования импортированной структуры и процедуры - ошибки.
прошу подсказки, в чем дело? почему в консольном приложении работает как положено, а в Windows Forms нет, при том что
располагаю объявление структуры, как мне кажется, в одном и том же месте... MS VS 2008
[/more] [/more]
Есть одна проблемка
Суть- один xml файл и надо бы отсортировать его items алфавитно (именно сам xml файл а не данные с него) по string что в <match>...</match> находится.
Дело в том что есть одна программа, которая читает этот файл но в ней нет сортировки- как читает этот файл так и показывает данные. Недоделали ее. Надо бы ей помочь
Пример XML здесь
[more]
Код:
...
<snippets namespace="" license="x" filetypes="Fortran" authors="none" name="fortran">
<script></script>
<item>
<displayprefix></displayprefix>
<match>allocatable</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>allocatable ${cursor}</fillin>
</item>
<item>
<displayprefix></displayprefix>
<match>allocate()</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>allocate(${cursor})</fillin>
</item>
<item>
<displayprefix></displayprefix>
<match>character(len=*)::</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>character(len=*):: ${cursor}</fillin>
</item>
...
Суть- один xml файл и надо бы отсортировать его items алфавитно (именно сам xml файл а не данные с него) по string что в <match>...</match> находится.
Дело в том что есть одна программа, которая читает этот файл но в ней нет сортировки- как читает этот файл так и показывает данные. Недоделали ее. Надо бы ей помочь
Пример XML здесь
[more]
Код:
...
<snippets namespace="" license="x" filetypes="Fortran" authors="none" name="fortran">
<script></script>
<item>
<displayprefix></displayprefix>
<match>allocatable</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>allocatable ${cursor}</fillin>
</item>
<item>
<displayprefix></displayprefix>
<match>allocate()</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>allocate(${cursor})</fillin>
</item>
<item>
<displayprefix></displayprefix>
<match>character(len=*)::</match>
<displaypostfix></displaypostfix>
<displayarguments></displayarguments>
<fillin>character(len=*):: ${cursor}</fillin>
</item>
...
terminat0r
libxml2
libxml2
Здравствуйте уважаемые специалисты.
Помогите пожалуйста решить проблемку. Ситуация такая. Раньше, создавал программы только с одним окном, но продолжая расти, столкнулся с необходимостью создать много оконное приложение. А точнее два окна. Значит теперь подробно:
ОС: Windows 7.
Среда: Visual Studio 2010.
Приложение: Windows Form.
Значит имеем форму, на ней кнопка. При нажатии на кнопку, должна появится вторая форма. Все. Значит что сделано. Создана вторая форма (имя: TestWindow), сохранена. В первой форме сделано подключение второй формы (#include "TestWindow.h"). И в обработчике события при нажатии на кнопку, сделан её вызов:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
TestWindow -> Show();
}
Но вот при попытке создать программу, появляются две ошибки:
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
с указанием на эту строку: TestWindow -> Show();
Вопрос, что сделано мной не так? (((.
Помогите пожалуйста решить проблемку. Ситуация такая. Раньше, создавал программы только с одним окном, но продолжая расти, столкнулся с необходимостью создать много оконное приложение. А точнее два окна. Значит теперь подробно:
ОС: Windows 7.
Среда: Visual Studio 2010.
Приложение: Windows Form.
Значит имеем форму, на ней кнопка. При нажатии на кнопку, должна появится вторая форма. Все. Значит что сделано. Создана вторая форма (имя: TestWindow), сохранена. В первой форме сделано подключение второй формы (#include "TestWindow.h"). И в обработчике события при нажатии на кнопку, сделан её вызов:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
TestWindow -> Show();
}
Но вот при попытке создать программу, появляются две ошибки:
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
с указанием на эту строку: TestWindow -> Show();
Вопрос, что сделано мной не так? (((.
Создаю объект класса, потом реинициализирую его другим конструктором.
Очень удивился, когда увидел, что деструктор вызывается после вызова второго конструктора, а не до. Ведь логичнее было бы разрушить старый объект перед созданием нового, а здесь получается, что сначала имеем один объект, потом реинициализиреум его поля, потом вызываем деструктор, потом работаем с новымыми значениеями полей. Почему в таком странном порядке идет работа? Ладно еще, если не используем динамическую память (хотя зачем нам деструктор без нее?), - тогда внешне все в порядке. А вот если попробовать вызвать a1.show() после второй инициализации, то сначала вместо значения, хранящегося в p, получим какое-то произвольное число, а потом вылетит исключение.
Ниже вывод программы и код.
Вывод.
Цитата:
Код без указателя.
Код: #include "stdafx.h"
#include <iostream>
using namespace std;
class A {
int x, y;
public: A() { x = y = -1; cout << "Created default" << endl; }
A(int xx, int yy) { x = xx; y = yy; cout << "Created" << endl; }
~A() { cout << "Deleted" << endl; }
void show() { std::cout << x << " " << y << endl; }
};
int _tmain(int argc, _TCHAR* argv[]) {
A a1 = A(10, 10);
a1.show();
cout << "Other values" << endl;
a1 = A(100, 100);
a1.show();
system("pause");
return 0;
}
Очень удивился, когда увидел, что деструктор вызывается после вызова второго конструктора, а не до. Ведь логичнее было бы разрушить старый объект перед созданием нового, а здесь получается, что сначала имеем один объект, потом реинициализиреум его поля, потом вызываем деструктор, потом работаем с новымыми значениеями полей. Почему в таком странном порядке идет работа? Ладно еще, если не используем динамическую память (хотя зачем нам деструктор без нее?), - тогда внешне все в порядке. А вот если попробовать вызвать a1.show() после второй инициализации, то сначала вместо значения, хранящегося в p, получим какое-то произвольное число, а потом вылетит исключение.
Ниже вывод программы и код.
Вывод.
Цитата:
Created
10 10
Other values
Created
Deleted
100 100
Для продолжения нажмите любую клавишу . . .
Код без указателя.
Код: #include "stdafx.h"
#include <iostream>
using namespace std;
class A {
int x, y;
public: A() { x = y = -1; cout << "Created default" << endl; }
A(int xx, int yy) { x = xx; y = yy; cout << "Created" << endl; }
~A() { cout << "Deleted" << endl; }
void show() { std::cout << x << " " << y << endl; }
};
int _tmain(int argc, _TCHAR* argv[]) {
A a1 = A(10, 10);
a1.show();
cout << "Other values" << endl;
a1 = A(100, 100);
a1.show();
system("pause");
return 0;
}
Red Planet
Это происходит из-за того, что деструктор вызывается 3 раза.
Дело в том, что второй вызов конструктора создает новый объект, затем происходит почленное копирование элементов и инициализируется третий объект(идет вызов оператора присвоения) и для каждого вызывается деструктор.
Исправить это можно с помощью перегрузки оператора присвоения:
Код: A& operator= (const A &a) {
if (this!=&a) {
delete p;
p=new int;
*p=*a.p;
}
return *this;
}
Это происходит из-за того, что деструктор вызывается 3 раза.
Дело в том, что второй вызов конструктора создает новый объект, затем происходит почленное копирование элементов и инициализируется третий объект(идет вызов оператора присвоения) и для каждого вызывается деструктор.
Исправить это можно с помощью перегрузки оператора присвоения:
Код: A& operator= (const A &a) {
if (this!=&a) {
delete p;
p=new int;
*p=*a.p;
}
return *this;
}
Red Planet
Цитата:
Да потому, что нет здесь никакой реинициализации. Есть копирование одного объекта в другой.
Код: a1 = A(100, 100);
Цитата:
Очень удивился, когда увидел, что деструктор вызывается после вызова второго конструктора, а не до. Ведь логичнее было бы разрушить старый объект перед созданием нового, а здесь получается, что сначала имеем один объект, потом реинициализиреум его поля, потом вызываем деструктор, потом работаем с новымыми значениеями полей. Почему в таком странном порядке идет работа?
Да потому, что нет здесь никакой реинициализации. Есть копирование одного объекта в другой.
Код: a1 = A(100, 100);
что-то я приплыл...
Код: //////////////////////////
file.h
__inline int foo();
//////////////////////////
file.c
#include "file.h"
__inline int foo() {
...
}
//////////////////////////
work.c
#include "file.h"
void main() {
int res;
res = foo();
printf("%d\n", res);
}
Код: //////////////////////////
file.h
__inline int foo();
//////////////////////////
file.c
#include "file.h"
__inline int foo() {
...
}
//////////////////////////
work.c
#include "file.h"
void main() {
int res;
res = foo();
printf("%d\n", res);
}
akaGM
перемести определение функции в заголовочный файл
перемести определение функции в заголовочный файл
karakurt2
охренеть...
это вообще не моя библиотека, но в оригинале именно так (на .h и .c) разнесено
и базовый компилятор -- гнусь
спасибо...
охренеть...
это вообще не моя библиотека, но в оригинале именно так (на .h и .c) разнесено
и базовый компилятор -- гнусь
спасибо...
Реализация встраиваемой функции должна быть известна на этапе компиляции, единица компиляции файл. В объявлении модификатор inline ообще не имеет смысла. Не представляю, как можно в объектный код поместить определение функции из другого объектного файла. Тогда уж это должен быть вызов внешней процедуры.
понятия не имею...
наткнулся, напоролся, спросил, помогли :)
сейчас вообще всё от#define'ю на фиг...
наткнулся, напоролся, спросил, помогли :)
сейчас вообще всё от#define'ю на фиг...
[more] Здравствуйте. Не понимаю разницы
Почему, когда я записываю в файл в бинарном режиме ТОЛЬКО строковый массив, то файл открывается в обычном режиме (никакого диалогового окна, предупреждающего, что файл бинарный, не выскакивает). При этом буквы в этом файле записаны на латинице. Хотя, как я понимаю, должна быть "абракадабра".
...............
сhar b[50] = "HELLO";
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc |fstream::binary);
out1.write((const char*) &(b), 5 * sizeof(char));
................
НО Если я записываю в бинарном режиме в файл ТОЛЬКО целочисленные константы, то выпадает диалоговое окно "ФАЙЛ БИНАРНЫЙ. ПРОДОЛЖИТЬ?". И, как положено, там всё записано "абракадаброй".
..........
int d = 3244, e = 3245;
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc | fstream::binary);
out1.write((const char*) &(d), sizeof(int)).write((const char*) &(e), sizeof(int));
....................
Ну и когда я записываю в файл и строковый массив и целочисленные константы, то при открытии файла выскакивает окно, предупреждающее, что файл бинарный. Целочисленные константы там "абракадаброй", строковый массив латиницей.
Поясните, пожалуйста. [/more]
Почему, когда я записываю в файл в бинарном режиме ТОЛЬКО строковый массив, то файл открывается в обычном режиме (никакого диалогового окна, предупреждающего, что файл бинарный, не выскакивает). При этом буквы в этом файле записаны на латинице. Хотя, как я понимаю, должна быть "абракадабра".
...............
сhar b[50] = "HELLO";
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc |fstream::binary);
out1.write((const char*) &(b), 5 * sizeof(char));
................
НО Если я записываю в бинарном режиме в файл ТОЛЬКО целочисленные константы, то выпадает диалоговое окно "ФАЙЛ БИНАРНЫЙ. ПРОДОЛЖИТЬ?". И, как положено, там всё записано "абракадаброй".
..........
int d = 3244, e = 3245;
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc | fstream::binary);
out1.write((const char*) &(d), sizeof(int)).write((const char*) &(e), sizeof(int));
....................
Ну и когда я записываю в файл и строковый массив и целочисленные константы, то при открытии файла выскакивает окно, предупреждающее, что файл бинарный. Целочисленные константы там "абракадаброй", строковый массив латиницей.
Поясните, пожалуйста. [/more]
cp58, Abs62, спасибо.
Следующее. Что скажете насчет такого кода? Все ли правильно?
Смысл такой. При сложении двух объектов сумма должна "знать" правого операнда. Поэтому заведен указатель *p, который проявляется только при сложении, в остальных случаях он никуда не указывает. Приведенный код работает, однако меня смущает то, что два указателя ссылаются на одно и тоже значение. См. оператор сложения, в нем строка
Код: p = right.p;
Следующее. Что скажете насчет такого кода? Все ли правильно?
Смысл такой. При сложении двух объектов сумма должна "знать" правого операнда. Поэтому заведен указатель *p, который проявляется только при сложении, в остальных случаях он никуда не указывает. Приведенный код работает, однако меня смущает то, что два указателя ссылаются на одно и тоже значение. См. оператор сложения, в нем строка
Код: p = right.p;
karakurt2
Цитата:
Именно для этого заведено -flto и что-то аналогичное в интеле.
Так что с гнусной версии 4.6 это имеет смысл.
Добавлено:
akaGM
Цитата:
Сатана соблазняет вас, сопротивляйтесь козням его!
Цитата:
Не представляю, как можно в объектный код поместить определение функции из другого объектного файла. Тогда уж это должен быть вызов внешней процедуры.
Именно для этого заведено -flto и что-то аналогичное в интеле.
Так что с гнусной версии 4.6 это имеет смысл.
Добавлено:
akaGM
Цитата:
сейчас вообще всё от#define'ю на фиг...
Сатана соблазняет вас, сопротивляйтесь козням его!
[more] Здравствуйте. Не понимаю разницы
Почему, когда я записываю в файл в бинарном режиме ТОЛЬКО строковый массив, то файл открывается в обычном режиме (никакого диалогового окна, предупреждающего, что файл бинарный, не выскакивает). При этом буквы в этом файле записаны на латинице. Хотя, как я понимаю, должна быть "абракадабра".
...............
сhar b[50] = "HELLO";
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc |fstream::binary);
out1.write((const char*) &(b), 5 * sizeof(char));
................
НО Если я записываю в бинарном режиме в файл ТОЛЬКО целочисленные константы, то выпадает диалоговое окно "ФАЙЛ БИНАРНЫЙ. ПРОДОЛЖИТЬ?". И, как положено, там всё записано "абракадаброй".
..........
int d = 3244, e = 3245;
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc | fstream::binary);
out1.write((const char*) &(d), sizeof(int)).write((const char*) &(e), sizeof(int));
....................
Ну и когда я записываю в файл и строковый массив и целочисленные константы, то при открытии файла выскакивает окно, предупреждающее, что файл бинарный. Целочисленные константы там "абракадаброй", строковый массив латиницей.
Поясните, пожалуйста. [/more]
Почему, когда я записываю в файл в бинарном режиме ТОЛЬКО строковый массив, то файл открывается в обычном режиме (никакого диалогового окна, предупреждающего, что файл бинарный, не выскакивает). При этом буквы в этом файле записаны на латинице. Хотя, как я понимаю, должна быть "абракадабра".
...............
сhar b[50] = "HELLO";
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc |fstream::binary);
out1.write((const char*) &(b), 5 * sizeof(char));
................
НО Если я записываю в бинарном режиме в файл ТОЛЬКО целочисленные константы, то выпадает диалоговое окно "ФАЙЛ БИНАРНЫЙ. ПРОДОЛЖИТЬ?". И, как положено, там всё записано "абракадаброй".
..........
int d = 3244, e = 3245;
out1.open("untitled.txt", fstream::in | fstream::out | fstream::trunc | fstream::binary);
out1.write((const char*) &(d), sizeof(int)).write((const char*) &(e), sizeof(int));
....................
Ну и когда я записываю в файл и строковый массив и целочисленные константы, то при открытии файла выскакивает окно, предупреждающее, что файл бинарный. Целочисленные константы там "абракадаброй", строковый массив латиницей.
Поясните, пожалуйста. [/more]
maximhik70
Потому, что блокнот проверяет первые N символов файла.
Если среди них нет ни одного непечатного, то он принимает файл за текстовый.
Если есть - бинарный.
Правда ещё шерстит по разным кодировкам, но получается у него хреново.
А ASCII текст (0х20..0х7Е) инвариантен.
Если посмотрите двоичным редактором/просмотрщиком - увидите, что у записаных переменных непонятные коды по sizeof(TYPE) байт на каждую, а текст так и остался текстом.
Потому, что блокнот проверяет первые N символов файла.
Если среди них нет ни одного непечатного, то он принимает файл за текстовый.
Если есть - бинарный.
Правда ещё шерстит по разным кодировкам, но получается у него хреново.
А ASCII текст (0х20..0х7Е) инвариантен.
Если посмотрите двоичным редактором/просмотрщиком - увидите, что у записаных переменных непонятные коды по sizeof(TYPE) байт на каждую, а текст так и остался текстом.
Программа виснет после return одной функции. Я останавливался там дебаггером, return проходит, после этого жму F8, в этот момент дебаггер теряет связь с программой: хочешь жми F8, хочешь не жми - толку никакого. Я подумал, что здесь может помочь какое-нибудь подробное логгирование. Ведь не просто так он закономерно в одном и том же месте виснет. Поискал немного, наткнулся на log4cpp, однако смутило то, что с 2007 он больше не разрабатывается
Цитата:
Также рекомендовали
Цитата:
Log4cxx и Log4cplus. Там предлагается скачать tar.gz и собрать при помощи ./configure, make, make install. Уже сомневаюсь, что это имеет какое-то отношение к Windows и C++Builder.
Matthew Wilson's Pantheios library. Не успею сегодня опробовать. А стоит ли?
Как можно посмотреть причину зависания? Предлагайте варианты, в том числе предполагающие отказ от Builder.
Версия Builder: C++Builder 2010.
Цитата:
I've used Log4cpp in the past and it does the job, though bear in mind the project has been inactive since 2007
Также рекомендовали
Цитата:
There are also the following alternatives:
Apache's log4cxx which is still active.
Matthew Wilson's Pantheios library.
Log4cplus.
Log4cxx и Log4cplus. Там предлагается скачать tar.gz и собрать при помощи ./configure, make, make install. Уже сомневаюсь, что это имеет какое-то отношение к Windows и C++Builder.
Matthew Wilson's Pantheios library. Не успею сегодня опробовать. А стоит ли?
Как можно посмотреть причину зависания? Предлагайте варианты, в том числе предполагающие отказ от Builder.
Версия Builder: C++Builder 2010.
Нужно отсортировать массив методом пузырька. Но у меня не получается.
http://s017.radikal.ru/i413/1202/44/99c302410098.jpg
[more=код]
[no]#include "stdafx.h"
#include<stdio.h>
#define N 3
int main()
{
int n=3;
int a[N], i, j;
for(i = 0 ; i < n; i++)
{
scanf("%d", &a[i]);
}
// сравниваем два соседних элемента.
for(i = 0 ; i < n ; i++)
{
// сравниваем два соседних элемента.
for(j = 0 ; j < n - i - 1 ; j++)
{
if(a[j] > a[j+1])
{
// если они идут в неправильном порядке, то
// меняем их местами.
int tmp = a[j]; a[j] = a[j+1] ; a[j+1] = tmp;
}
printf ("\n%d", a[j]);
}
}
}[/no]
[/more]
http://s017.radikal.ru/i413/1202/44/99c302410098.jpg
[more=код]
[no]#include "stdafx.h"
#include<stdio.h>
#define N 3
int main()
{
int n=3;
int a[N], i, j;
for(i = 0 ; i < n; i++)
{
scanf("%d", &a[i]);
}
// сравниваем два соседних элемента.
for(i = 0 ; i < n ; i++)
{
// сравниваем два соседних элемента.
for(j = 0 ; j < n - i - 1 ; j++)
{
if(a[j] > a[j+1])
{
// если они идут в неправильном порядке, то
// меняем их местами.
int tmp = a[j]; a[j] = a[j+1] ; a[j+1] = tmp;
}
printf ("\n%d", a[j]);
}
}
}[/no]
[/more]
lol2xD
Вот тут на одной из последних 10 страниц был метод пузырька.
Red Planet
Цитата:
После какой функции и в каком коде?
Вот тут на одной из последних 10 страниц был метод пузырька.
Red Planet
Цитата:
Программа виснет после return одной функции.
После какой функции и в каком коде?
День добрый. Пишу на C++ (MinGW), пользуюсь stdio для чтения/записи в файлы. Скажите, корректно из одной программы дважды открыть файл на чтение? Влияет ли операционная система на эту возможность (DOS/Win95/WinNT/...)?
нужно при открытии установить флаги возможного совместного доступа к файлу для чтения и для записи (отдельно). DOS - отдельная песня. а с виндой надо использовать апи функции поддерживаемые всеми системами, только с мсдн совсем недавно убрали информацию о поддержке ниже 2000-ка pro
Добавлено:
хотя если писать дос программу она то как раз будет работать с файлами во всех системах, сходу не вспомню о совместном доступе, ограничение будет файлы до 4 гиг
Добавлено:
хотя если писать дос программу она то как раз будет работать с файлами во всех системах, сходу не вспомню о совместном доступе, ограничение будет файлы до 4 гиг
nick7inc
интересно узнать необходимость такого открытия...
забыл, что туда раньше написал? :)
может тебя устроил бы режим а+ и fseek(), rewind() и fsetpos()
интересно узнать необходимость такого открытия...
забыл, что туда раньше написал? :)
может тебя устроил бы режим а+ и fseek(), rewind() и fsetpos()
очень необходимая вечь - например позволяет качать двумя торрент клиентами один файл с разных трекеров, или качать один файл из интернета менеджером закачки и торрент клиентом, смотреть недокачанный фильм в плеере, чиать в блокноте пишушийся лог ...
Цитата:
Скажите, корректно из одной программы дважды открыть файл на чтение?
и чего тут может быть некорректного, не нужно будет каждый раз туда сюда дергать указатель. только не надо забывать что на количество открытых файлов есть ограничение
по мне, так у товарища хромает логика работы с данным файлом, а не техника его многократного открытия для однотипных операций...
bomzzz
Цитата:
У меня сейчас запросы поменьше. Пишу под MinGW, там это ограничение легко обходится в STDIO.
akaGM
Цитата:
Пожалуйста. Я пишу полиморфный тип UFILE *f, который при помощи знакомых функций stdio (fopen(), fwrite, fread(), fseek(), fprintf(), fscanf() и т.д.) оперирует с данными практически из любого места: файл на диске, буффер в памяти, ... Сейчас мне надо сделать чтение из ZIP архива. А читать иногда приходится параллельно 2 разных файла из архива. Чтобы не морочиться с fseek() (туда-сюда), как раз нужно чтение из одного файла параллельными потоками.
[more=Код]
Код:
virtual void close (void) = 0;
virtual void open (const char *name, const char *par1) = 0;
virtual void flush (void) {};
virtual long tell (void) = 0;
virtual bool eof (void) = 0;
virtual unsigned long int lof (void) = 0; // Длинна файла
virtual void seek (long offset, int mode) = 0;
virtual size_t read (void *buffer, size_t size, size_t number) = 0;
virtual size_t write (const void *buffer, size_t size, size_t number) = 0;
size_t read (class DataBuffer &dbuffer, size_t size);
size_t write (const class DataBuffer &dbuffer);
size_t put_byte (unsigned char byte);
char get_byte (void);
size_t printf (const char *format, ...)
__attribute__ ( (format (printf, 2, 3)));
virtual size_t xscanf (const char *format, ...)
__attribute__ ( (format (scanf, 2, 3))) = 0;
size_t puts (const char *message);
virtual size_t line_input (void *buffer, const size_t size);
Цитата:
ограничение будет файлы до 4 гиг
У меня сейчас запросы поменьше. Пишу под MinGW, там это ограничение легко обходится в STDIO.
akaGM
Цитата:
интересно узнать необходимость такого открытия...
Пожалуйста. Я пишу полиморфный тип UFILE *f, который при помощи знакомых функций stdio (fopen(), fwrite, fread(), fseek(), fprintf(), fscanf() и т.д.) оперирует с данными практически из любого места: файл на диске, буффер в памяти, ... Сейчас мне надо сделать чтение из ZIP архива. А читать иногда приходится параллельно 2 разных файла из архива. Чтобы не морочиться с fseek() (туда-сюда), как раз нужно чтение из одного файла параллельными потоками.
[more=Код]
Код:
virtual void close (void) = 0;
virtual void open (const char *name, const char *par1) = 0;
virtual void flush (void) {};
virtual long tell (void) = 0;
virtual bool eof (void) = 0;
virtual unsigned long int lof (void) = 0; // Длинна файла
virtual void seek (long offset, int mode) = 0;
virtual size_t read (void *buffer, size_t size, size_t number) = 0;
virtual size_t write (const void *buffer, size_t size, size_t number) = 0;
size_t read (class DataBuffer &dbuffer, size_t size);
size_t write (const class DataBuffer &dbuffer);
size_t put_byte (unsigned char byte);
char get_byte (void);
size_t printf (const char *format, ...)
__attribute__ ( (format (printf, 2, 3)));
virtual size_t xscanf (const char *format, ...)
__attribute__ ( (format (scanf, 2, 3))) = 0;
size_t puts (const char *message);
virtual size_t line_input (void *buffer, const size_t size);
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
Предыдущая тема: не знаю как назвать тему :-)
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.