Форум программистов, компьютерный форум CyberForum.ru

Fopen не видит путь к файлу - C++

Восстановить пароль Регистрация
 
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 20:38     Fopen не видит путь к файлу #1
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
 
typedef std::map<std::string, std::string> mapss;
 
// An unsigned char can store 1 Bytes (8bits) of data (0-255)
typedef unsigned char BYTE;
 
// Get the size of a file
long getFileSize(FILE *file);
//Get all files names
std::vector<std::string> getFiles(int argc, char** str);
std::string getFileBuf(const char* filePath);
bool isExist(mapss& files, std::string curFile);
mapss fillExistFiles(std::fstream &result);
bool isChanged(mapss& files, std::string curFile);
 
 
int main(int argc, char** argv)
{
    std::string resultPath;
    std::fstream result;
    result.open(resultPath);
    std::vector<std::string> files = getFiles(argc, argv); 
    mapss existFiles = fillExistFiles(result);
    if (existFiles.empty())
        std::cout<<"No History detected!"<<std::endl;
    result.close();
    
    for(auto file : files)
        if(isExist(existFiles,file))
            if(isChanged(existFiles,file))      
                std::cout<<file<<" ----> " << "not changed!"<<std::endl;
            else
                std::cout<<file<<" ----> " << "changed!"<<std::endl;
        else
        {
 
            result.open(resultPath,std::ios::app);
            result<<file<<" "<<getFileBuf(file.c_str());
            std::cout<<file<<" ----> "<< "added to history!"<<std::endl;
        }
    result.close(); 
    return 0;
}
 
std::string getFileBuf(const char* filePath)
{
    std::cout<<filePath;
    BYTE *fileBuf;          // Pointer to our buffered data
    FILE *file = NULL;      // File pointer
    // Open the file in binary mode using the "rb" format string
    // This also checks if the file exists and/or can be opened for reading correctly
    if (([COLOR="red"]file = fopen(filePath, "rb")) == NULL[/COLOR]) {
        std::cout << "Could not open specified file" << std::endl;
        exit(-1);
    }
 
    // Get the size of the file in bytes
    long fileSize = getFileSize(file);
 
    // Allocate space in the buffer for the whole file
    fileBuf = new BYTE[fileSize];
 
    // Read the file in to the buffer
    fread(fileBuf, fileSize, 1, file);
 
    // Now that we have the entire file buffered, we can take a look at some binary infomation
    // Lets take a look in hexadecimal
    char hexstr[201];
    int i;
    for (i = 0; i < 100; i++)
        sprintf(hexstr+i*2, "%02x", fileBuf[i]);
    //printf("%X ", fileBuf[i]);
    hexstr[i*2] = 0;
 
    return hexstr;
}
 
long getFileSize(FILE *file)
{
    long lCurPos, lEndPos;
    lCurPos = ftell(file);
    fseek(file, 0, 2);
    lEndPos = ftell(file);
    fseek(file, lCurPos, 0);
    return lEndPos;
}
 
std::vector<std::string> getFiles(int argc, char** str)
{
    std::string s;
    for(int i = 1; i < argc; i++)
        s += str[i];
    std::string delimiter = ",";
    std::vector<std::string> files;
    size_t pos = 0;
    while ((pos = s.find(delimiter)) != std::string::npos) {
        std::string token = s.substr(0, pos);
        files.push_back(token);
        s.erase(0, pos + delimiter.length());
    }
    files.push_back(s.c_str());
    return files;
}
 
mapss fillExistFiles(std::fstream &result) 
{
    mapss existFiles;
    std::string str;
    while(true) {   
        if(!result.eof())
        {
            getline(result, str);
            if(str == "")
                break;
            size_t pos = 0;
            std::string delimiter = " ";            
            pos = str.find(delimiter);
            std::string name = str.substr(0, pos);
            str.erase(0, pos + delimiter.length());
            pos = str.find(delimiter);
            std::string hex = str.substr(0, pos);
            existFiles.insert(std::pair<std::string,std::string>(name,hex));
        }           
        else
            break;
    }
    return existFiles;
}
 
bool isExist(mapss& files, std::string curFile)
{
    mapss::const_iterator it = files.find(curFile);
    return it!=files.end();
}
 
bool isChanged(mapss& files, std::string curFile) 
{
    mapss::const_iterator it = files.find(curFile);
 
    return !getFileBuf(curFile.c_str()).compare(it->second); //if similar, return false (logic)
}
В функции getFileBuf в пятьдесят первой строке подчеркнуто то место, в которое передается путь файла, но fopen вообще ее не видит. Передаю типа C:\\hello\\add.txt. Если запихаю это в стринг, инициализрованный рядом, все прекрасно видит. в чем проблема.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mishelle92
57 / 56 / 19
Регистрация: 09.10.2012
Сообщений: 179
Завершенные тесты: 1
13.08.2014, 21:02     Fopen не видит путь к файлу #2
Цитата Сообщение от Warezovvv Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
std::vector<std::string> getFiles(int argc, char** str)
{
    std::string s;
    for(int i = 1; i < argc; i++)
        s += str[i];
    std::string delimiter = ",";
    std::vector<std::string> files;
    size_t pos = 0;
    while ((pos = s.find(delimiter)) != std::string::npos) {
        std::string token = s.substr(0, pos);
        files.push_back(token);
        s.erase(0, pos + delimiter.length());
    }
    files.push_back(s.c_str());
    return files;
}
А зачем последний push_back? В него все аргументы подряд запишутся. Вы уверены, что так нужно?
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 22:17  [ТС]     Fopen не видит путь к файлу #3
erase() не просто так тут)
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
13.08.2014, 22:36     Fopen не видит путь к файлу #4
Цитата Сообщение от Warezovvv Посмотреть сообщение
Передаю типа C:\\hello\\add.txt.
Прям так и передаешь в параметр командной строки? Т.е.
myapp C:\\hello\\add.txt
,
да?
mishelle92
57 / 56 / 19
Регистрация: 09.10.2012
Сообщений: 179
Завершенные тесты: 1
13.08.2014, 22:40     Fopen не видит путь к файлу #5
Цитата Сообщение от Warezovvv Посмотреть сообщение
erase() не просто так тут)
Да, не заметил. Передал d:\my.txt,d:\my.txt - файл открывается.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
13.08.2014, 22:42     Fopen не видит путь к файлу #6
Цитата Сообщение от mishelle92 Посмотреть сообщение
Передал d:\my.txt,d:\my.txt - файл открывается.
Я думаю он передает как я написал, с экранированием. Но это не нужно делать вне исходного кода
Кажется проблема в этом.
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 22:44  [ТС]     Fopen не видит путь к файлу #7
Цитата Сообщение от DrOffset Посмотреть сообщение
Сообщение от Warezovvv
Передаю типа C:\\hello\\add.txt.
Прям так и передаешь в параметр командной строки? Т.е.
myapp C:\\hello\\add.txt
,
да?
Ты же можешь в код сначала посмотреть, а потом спрашивать?! Счетчик argc начинается с 1, а не с 0.

Добавлено через 56 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Я думаю он передает как я написал, с экранированием. Но это не нужно делать вне исходного кода
Кажется проблема в этом.
CompareFiles.exe C:\GameDev\Safty Code challenger\OriginalFiles\ass.txt
не робит
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
13.08.2014, 22:45     Fopen не видит путь к файлу #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Warezovvv Посмотреть сообщение
Ты же можешь в код сначала посмотреть, а потом спрашивать?!
Нервы отставить.
Я на другое намекаю. Ты строку передаешь с двумя слешами или с одним?

Добавлено через 20 секунд
Цитата Сообщение от Warezovvv Посмотреть сообщение
CompareFiles.exe C:\GameDev\Safty Code challenger\OriginalFiles\ass.txt
не робит
Потому что там пробелы как бы.
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 22:46  [ТС]     Fopen не видит путь к файлу #9
Передал C:\asss.txt, заработало :|
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2014, 22:50     Fopen не видит путь к файлу
Еще ссылки по теме:

путь к файлу C++
C++ Путь к файлу
Путь к файлу C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
13.08.2014, 22:50     Fopen не видит путь к файлу #10
Цитата Сообщение от Warezovvv Посмотреть сообщение
Передал C:\asss.txt, заработал
Параметры с пробелами надо брать в кавычки.

Добавлено через 2 минуты
Warezovvv, кстати, код я твой посмотрел, даже скомпилировал и запустил на разных вариантах. Когда увидел, что он работает, то вывод остался один: что-то не так с параметрами командной строки. Вот и все
Yandex
Объявления
13.08.2014, 22:50     Fopen не видит путь к файлу
Ответ Создать тему
Опции темы

Текущее время: 12:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru