Vaclav_ Ответов: 3

Как сделать так, чтобы "fstream" принимал все символы?


Прилагаемый код работает только тогда, когда "test.txt" используется в качестве имени файла.
Когда ... "test_1.txt" используется он не в состоянии создать / открыть файл.
Конечно, это не работает, когда используется реальное имя файла.
Очевидно, мне нужен настоящий Мак-Кой, чтобы работать, но пока он терпит неудачу, просто проверяя его.


//#define MERGE_1 "/media/z/DEV_COPY_LABEL/ECLIPSE_FOLDER/2019-12/Eclipse_2019_12/eclipse/Workspace_2019_12/RPI_BT_LIB_ARM/MODULE/M_ARM_SOCKET/CARMSOCKET.h"
#define MERGE_1  "test_1.txt"
#define MERGE_1  "test.txt"
	std::string str(MERGE_1);
	char *cstr = new char[str.length() + 1];
	std::strcpy(cstr, str.c_str());
	cout << "cstr " << +cstr << endl;
	fstream fs;
	fs.open(cstr);
	perror_cpp("File state ");
	cout << " Merged file created OK " << endl;


Что я уже пробовал:

Текла инструкция использовать c_str, и она не работает ни с чем, кроме Альфа-символов.

3 Ответов

Рейтинг:
8

Vaclav_

<a href="http://www.cplusplus.com/reference/fstream/fstream/open/">fstream::open - C++ Reference</a>[<a href="http://www.cplusplus.com/reference/fstream/fstream/open/" target="_blank" title="New Window">^</a>]

From the above reference and its example (attached) it looks as fstream despite being advertised as "input / output"  still needs in/ out parameters. 

I am now successfully   using ifstream and ofstream. 
(May try plain fstream with  i/o parameters later )  

PS I woudl even question the necessity of usage of std::(fstream)  in the example. 

// fstream::open / fstream::close
#include <fstream>      // std::fstream

int main () {

  std::fstream fs;
  fs.open ("test.txt", std::fstream::in | std::fstream::out | std::fstream::app);
  fs << " more lorem ipsum";
  fs.close();
  return 0;
}


Richard MacCutchan

Если вы создаете новый файл, то вы должны использовать std::fstream::out, но вы не нид std::fstream::in.

Рейтинг:
2

Richard MacCutchan

Для меня это прекрасно работает. Но почему вы копируете с a string К char массив? Все, что вам нужно, это:

fs.open(str); // fstream methods can handle string variables

Кроме того, str.c_str() будет обрабатывать все символы в наборе ASCII: буквенные, цифровые, специальные и т. д. Таким образом, любая проблема, которую вы видите, не ясна из приведенного выше кода.


Vaclav_

Я пробовал оба типа char и String - не одинаково.

Richard MacCutchan

Оказывается, что если вы не укажете ios_base::out в open вызовите, библиотека ожидает, что файл уже существует.

Рейтинг:
2

OriginalGriff

На первый взгляд, это проблема с разрешениями.
Вы не указываете путь, что означает, что он попытается открыть или создать файл в текущей папке eth, которая для установленного исполняемого файла будет папкой установки приложения. Во многих системах (включая Windows) они по умолчанию защищены от записи, чтобы уменьшить активность вирусов.

Попробуйте указать свой файл с явным абсолютным путем к "безопасной" папке, и он должен работать.


Vaclav_

Почему другой формат имени ведет себя таким образом ?

OriginalGriff

скорее всего, это не так: возможно, папка, в которой вы работаете, не имеет разрешения на создание файла или файл может использоваться. Первое, что нужно сделать, это точно выяснить, что происходит, а для этого вам нужно явно указать папку и начать проверять, что происходит.
Если я попробую его кодировать, он работает - именно так, как я ожидал бы, - так что это что-то специфичное для вашей среды или того, как работает ваше приложение, которое я не могу дублировать.

Vaclav_

Для того, чтобы "узнать, что происходит" комментарий будет лишним. Не очень-то полезно...Насколько я помню, "открыть" создает файл, если он не существует, а затем открывает его для любого заданного режима или в случае потока фактической "командой".
Расположение файла в этом случае несущественно, возможно, я получу другую ошибку, если файл не может быть создан "в папке". ( Далее я выберу несуществующую папку ) я пытаюсь отладить это каким - то логическим способом, изменив анализ единственной вещи, которая меняется-имени файла.

Вот моя последняя версия

потока file_1;
file_1.open("file_1.txt"); //открыть файл
если (file_1.is_open())
соиь <&ЛТ; "открыть" на << епси;
еще
соиь <&ЛТ; "закрытые" на << епси;

socket.perror_cpp("состояние файла 1 ");
file_1 << "Hello file\n" << 75; //запись в него
file_1.close(); //закройте его

fstream file_2;
file_2.open("file_2.txt"); //открыть файл
если (file_2.is_open())
соиь <&ЛТ; "открыть" на << епси;
еще
соиь <&ЛТ; "закрытые" на << епси;
socket.perror_cpp("состояние файла 2 ");
file_2 << "Hello file\n" << 75; //запись в него
file_2.close(); //закройте его

Первый "открытый" работает, второй терпит неудачу - последовательно.