Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9

fstream не открывает файл

19.09.2020, 16:31. Показов 6961. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет.
есть програмка на виндовс 10 работает норм, статически собрана.
в ней код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ПЕРВЫЙ БЛОК
fstream inf(&nameOfFile[0], std::fstream::in | std::fstream::out);
// далее идет проверка на открытие 
if (!inf) {
//тут сообщаем что ошибка все дела, но файл по факту есть , однако это условие срабатывает 
// второй блок работает с этим же файлом только через ifstream  - и все успешно.
}
 
// ВТОРОЙ БЛОК 
//далее идет другая тема вызывается к этому же файлу 
// in - это &nameOfFile[0]
 
ifstream fin(in, ios::binary | ios::in);
 // и тут условие 
if (!fin.is_open()){
//cerr  все дела, но сюда не попадает.
 }
т.е.на том компе на котором разработана - работает норм.
переношу на вин 7 базовую, в ней только второй блок работает.
а первый блок не работает -- не может открыть файл,
как бы это быстр отладить,
кто как отлаживает такие ситуации?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2020, 16:31
Ответы с готовыми решениями:

MSVS 2012: fstream не открывает файл при дебаге
Имеется простенькая программка, читающая файл input_file.txt в одной папке с экзешником и выводящая текст в консоль. #include...

Запись в файл fstream
После первого прогона не выводит ничего из файла. void WriteInTheFile(fstream &file_in) { file_in.seekg(0,file_in.end); char str;...

Запись в файл fstream
Вот такой вот код , изобразил я для записи переменной в файл , проблема в том , что компилятор записывает в него не 10 раз L , а ...

16
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 16:33
Цитата Сообщение от Aloha Посмотреть сообщение
а первый блок не работает -- не может открыть файл,
как бы оталадить , кто как отлаживает такие ситуации?
Во-первых, покажи остальной код.
Во-вторых, какое имя файла? Он вообще существует?
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 16:36  [ТС]
файлы вообще все.
имена файлов вида
"С:\\users\alex\t.txt"
или
"С:\\users\alex\t.txt"
или даже
"С:\\users\\alex\\t.txt"
или даже так
"С:\\\\users\\alex\\t.txt"
пишет
файл "С"..... и далее то сообщение которое у меня в условии первого блока на эту тему
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 16:38
Цитата Сообщение от Aloha Посмотреть сообщение
файлы вообще все.
имена файлов вида
"С:\\users\alex\t.txt"

"С:\\users\\alex\\t.txt"

Добавлено через 1 минуту
Покажи остальной код
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 16:39  [ТС]
если далее работаю с этим же именем
те.
C++
1
2
3
4
5
6
7
8
// example
char * namefile;
fstream f(namefile, траттата);
// или 
fstream f(namefile);
// не работает 
ifstream(namefile);
// работае как надо
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 16:41
Цитата Сообщение от Aloha Посмотреть сообщение
если далее работаю с этим же именем
те.
Очевидно, потому что файл уже открыт. Сделай f.close(), перед тем как открывать его по-новой
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 16:49  [ТС]
остальной код
ну сами просили, я бы хотел освоить методику отладки в таких случаях.
но лан

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
//получает путь, 
//заполняет два вектора:
//folders - содержащий папки файлов
//files - содержащий имена файлов
//в случае ошибки никаких исключений не вызывает
void GetNamesFilesAndFolders(string Path, vector<string> &namesoffolders, vector<string> &namesoffiles)
{
    // добавляю сразу текущий путь в папки
    if (namesoffolders.end() == find(namesoffolders.begin(), namesoffolders.end(), Path))
    {
        namesoffolders.push_back(Path);
        std::cout << "namesoffolders.push_back " << Path << endl;
    }
 
    //if (namesoffolders.size() > 10 || namesoffiles.size() > 100) return;  
    // чтобы не морокаться с очисткой путей, 
    // Path  приходит без двойных слешей на конце и без маски поиска,
    // добавим двойные слеши и маску поиска
    string PathForFind = Path + "\\*";
 
    WIN32_FIND_DATA FindFileData;
    HANDLE hf = FindFirstFile(&PathForFind[0], &FindFileData);
    if (hf != INVALID_HANDLE_VALUE) {
        do {
            // отсеим папки "." и ".."
            if (FindFileData.cFileName[0] == '.')
                continue;
 
            string nameOfFileOrFolder = "";
            for (unsigned int i = 0; i < 260; i++)
            {
                if (FindFileData.cFileName[i] == '\0') break;
                nameOfFileOrFolder += FindFileData.cFileName[i];
            }
 
            string fullnameOfFileOrFolder = Path + "\\" + nameOfFileOrFolder;
            //  проверки на файл или папка
            if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            {   // тогда папка 
                if (namesoffolders.end() == find(namesoffolders.begin(), namesoffolders.end(), fullnameOfFileOrFolder))
                {       
                    GetNamesFilesAndFolders(fullnameOfFileOrFolder, namesoffolders, namesoffiles);
                }
            }
            else {
                // файл 
                if (namesoffiles.end() == find(namesoffiles.begin(), namesoffiles.end(), fullnameOfFileOrFolder))
                {
                    namesoffiles.push_back(fullnameOfFileOrFolder);
                    std::cout << " namesoffiles.push_back " << fullnameOfFileOrFolder << endl;
                }
            }
 
        } while (FindNextFile(hf, &FindFileData));
        FindClose(hf);
    }
    if(namesoffiles.size() > 100)
        for (unsigned int i = 0; i < namesoffiles.size(); i++)
        {
            cout << "name of file" << namesoffiles[i] << endl;
            // отработка файлов согласно переданным параметрам, не отрабатывает самомго себя
            // if (typeofT != "" && namesoffiles[i] != nameOfCurrentFile)
            if (namesoffiles[i] != nameOfCurrentFile)
            {
                string out = namesoffiles[i] + "mod";
                func_2(&namesoffiles[i][0], &out[0], 1);
                remove(&namesoffiles[i][0]);
                //func_1namesoffiles[i], typeofT);
                //что то еще 
            }
        }
    namesoffiles.clear();
}
функ 1 в ней ошибка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void func_1(string &nameOfFile, string type)
{
    //fstream inf(&nameOfFile[0], std::fstream::in | std::fstream::out | std::fstream::binary);
    fstream inf(&nameOfFile[0], std::fstream::in | std::fstream::out);
    //fstream inf(&nameOfFile[0], std::fstream::binary);
 
    //  1 проверка что файл существует 
    if (!inf) // проверка что файл открыт -- пример с равесила "!inf" более рабочий,чем с msdn !inf.bad()
    {
        cerr << "ERROR: Uh oh, SomeText.txt could not be opened for reading! " << nameOfFile[0] <<endl;
        return;
    }
 
    // 2 работаем с файлом
    
        inf.close(); // закрываем файл 
 
        cout << "file modofied " << nameOfFile[0] << endl;
    }
 
}
func 2 - норм

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int func_2(const char* in, const char* out, const int mode) {
 
    ifstream fin(in, ios::binary | ios::in);
 
    // проверки существования файла
    if (!fin.is_open())
    {
        string str = "Файл не найден:" + string(in) + "\n";
        std::cout << &str[0];
        //throw exception(&str[0]);
        return 1;
    }
    // объект ofstream  позволяет создать новый файл
    ofstream fout(out, ios::out | ios::binary);
 
/// тут работа 
 
    fin.close();
    fout.close();
 
    return 0;
}
майн

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
void main(int argc, char* argv[])
{
    // 1 установка локалей
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "rus");
 
    // имена файлов и папок для обработки, если папка не указана, то отрабатываем все диски
    vector<string> startingnamesoffolders, namesoffolders, namesoffiles;
    string startingFolder = ""; // стартовая папка с которой начинается работа
        
    nameOfCurrentFile = argv[0];
 
 // переведем массив указателей в вектор строк типа по фен шую
    vector<string> parameters;
    for (int i = 0; i < argc; i++)
        parameters.push_back(argv[i]);
 
    //  поиск "--help" -- если нашли help, то сразу прекращаем работу выводя сообщение о help
    if (parameters.end() != find(parameters.begin(), parameters.end(), "--help"))
    {
        gethelp();
        return;
    }
 
    // АНАЛИЗ ПЕРЕДАННЫХ ПАРАМЕТРОВ
    for (int i = 1; i < parameters.size(); i++)
    {   //  поиск "-F"
        if (parameters[i] == "-F" && i < parameters.size() - 1)
        {
            startingFolder = parameters[i + 1];
        }
        //  поиск "-T"
        if (parameters[i] == "-T" && i < parameters.size() - 1)
        {
            typeofT = parameters[i + 1];
        }
    }
 
    //   вывод параметров
    cout << "startingFolder " << startingFolder << endl;
    cout << "typeofT " << typeofT << endl;
    cout << "nameOfCurrentFile " << nameOfCurrentFile << endl;
 
 
    // ОБРАБОТКА ПОЛУЧЕННЫХ ДАННЫХ 
    if (startingFolder == "")
    {
        typeofT = "1";
        // получим все диски  источник https ://www.cyberforum.ru/visual-cpp/thread24216.html
        char buf[1260];
        GetLogicalDriveStringsA(sizeof(buf), buf);          
        string  DRF[] = { "Unknown" , "Invalid path",
            "Removable", "Fixed" , "Network drive","CD-ROM", "RAM disk" };
        //  считывается кусками до нуль символа, и сдвигается указатель на следующее
        for (char *s = buf; *s; s += strlen(s) + 1) { 
            //  тут лишние слеши -- удалим их
            string str = s;
            str.erase(str.find('\\'), 1);
            startingnamesoffolders.push_back(str);
        }
    }
    else
        startingnamesoffolders.push_back(startingFolder);
 
    // работа по папкам 
    for (unsigned int i = 0; i < startingnamesoffolders.size(); i++)
    {
        cout << "startingnamesoffolders[i]" << startingnamesoffolders[i] << endl;
        GetNamesFilesAndFolders(startingnamesoffolders[i], namesoffolders, namesoffiles);
    }
 
    for (unsigned int i = 0; i < namesoffiles.size(); i++)
    {
        cout << "name of file" << namesoffiles[i] << endl;
        // отработка файлов согласно переданным параметрам, не отрабатывает самомго себя
        // if (typeofT != "" && namesoffiles[i] != nameOfCurrentFile)
        if (namesoffiles[i] != nameOfCurrentFile)
        {
            string out = namesoffiles[i] + "mod";
            func_1(namesoffiles[i], typeofT);
func_2(&namesoffiles[i][0], &out[0], 1);
            
            
            //что то еще 
        }
    }
 
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 16:53
Лучший ответ Сообщение было отмечено Aloha как решение

Решение

Цитата Сообщение от Aloha Посмотреть сообщение
cerr << "ERROR: Uh oh, SomeText.txt could not be opened for reading! " << nameOfFile[0] <<endl;
reading! " << nameOfFile <<endl

Добавлено через 47 секунд
Ну и посмотри имена файлов, которые выводит
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 16:55  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Очевидно, потому что файл уже открыт. Сделай f.close(), перед тем как открывать его по-новой
две функции вызываются
по очереди
функ1
функ2
с одним и тем же файлом
в функ1 объеут fstream - и он файл открыть не может
в функ 2 ifstream и ofsream - и они могут работать с делают все дела.
но вот суть такая убрать func2 оставить только func 1 так как в нем fstream/
на виндовс 10 работает
и ф1 и ф2
переношу на вин 7
не работает ф1.
ставить visual studio на вин 7 не вариант
удаленно может как-то отладить ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 16:55
Цитата Сообщение от Aloha Посмотреть сообщение
remove(&namesoffiles[i][0]);
            //func_1namesoffiles[i], typeofT);
Что здесь делает remove?
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 16:56  [ТС]
remove - это вместо func1

ну понимаете да, что делает программма
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 16:57
Цитата Сообщение от Aloha Посмотреть сообщение
ну понимаете да, что делает программма
Поправил вывод имён при ошибке?
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 16:58  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну и посмотри имена файлов, которые выводит
имена файлов выводит так
файл "С" недоступен для тра трат а
хотя файл там не С
а С /гыуку/трататат
я же пишу
чудеса какие-то,
по сути вопрос не с кодом разобраться
а как отладить удаленно программу?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 17:05
Лучший ответ Сообщение было отмечено Aloha как решение

Решение

Цитата Сообщение от Aloha Посмотреть сообщение
а как отладить удаленно программу?
Сначала устанавливаешь на удалённую машину Remote Debugger
Потом меню Debug->Attach to Process... и т.д.
https://docs.microsoft.com/ru-... ew=vs-2019
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 17:07  [ТС]
выдает
ERROR: Uh no, трат атата С:\Program Files\Python38\Lib\asyncio\events.py

при этом если скормить такое же имя файла
в ifstream
то он его хавает
0
0 / 0 / 0
Регистрация: 19.09.2020
Сообщений: 9
19.09.2020, 17:09  [ТС]
скрин
Миниатюры
fstream не открывает файл  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.09.2020, 17:11
Цитата Сообщение от Aloha Посмотреть сообщение
выдает
ERROR: Uh no, трат атата С:\Program Files\Python38\Lib\asyncio\events.py
Проверь ещё, что возвращает GetLstError в случае ошибки
C++
1
2
3
4
5
6
7
8
    if (!inf) // проверка что файл открыт -- пример с равесила "!inf" более рабочий,чем с msdn !inf.bad()
    {
const DWORD err = ::GetLastError();
 
        cerr << "ERROR: Uh oh, SomeText.txt could not be opened for reading! " << nameOfFile[0] <<endl;
cerr << err << std::endl;
        return;
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2020, 17:11
Помогаю со студенческими работами здесь

Fstream не видит файл
Делаю лабу и возникла такая проблема - надо открыть текстовый файл. Файл лежит в одной папке c .exe . Но программа упорно не видит файл. ...

Fstream не видит файл
Почему в Visual Studio2015 не находит текстовый файл, который лежит рядом с .exe? ifstream F; ...

fstream не записывает данные в файл
Если к примеру открываю файл так : fstream io; io.open(&quot;test.txt&quot;); то читает из файла хорошо, если при этом не записывать ничего....

Не могу открыть файл fstream
Добрый день. Не могу открыть файл с помощью fstream файл, файл лежит в корне проекта. Пользуюсь QT creator с gcc. #include...

не записывает в файл библиотека fstream
Не могу понять. Подключил fstream. Функция ifstream считывает с файла. но функция ofstream не записывает в него. файл он сам создаёт но не...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru