Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
#1

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

13.08.2014, 20:38. Просмотров 1352. Ответов 9
Метки нет (Все метки)

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. Если запихаю это в стринг, инициализрованный рядом, все прекрасно видит. в чем проблема.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2014, 20:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Fopen не видит путь к файлу (C++):

fopen и путь к файлу c русскими буквами - C++
Всем привет:) Вот столкнулся с такой проблемой - необходимо открыть файл, путь к которому вводится в консоли. Для открытия файла...

Как указать пусть к файлу в fopen - C++
Здраствуйте, подскажите пожалуйсто, как мне указать определенный пусть к файлам в программе:#include &lt;stdio.h&gt; #include &lt;iostream&gt; ...

Как в функции открытия файла fopen() задать путь через ключи - C++
Как в функции открытия файла fopen() задать путь через ключи. Раньше путь задавался так: char...

Как в функции открытия файла fopen() задать путь через ключи - C++
Как в функции открытия файла fopen() задать путь через ключи. Раньше путь задавался так: char...

Путь к файлу - C++
Всем привет) помогите как считать строки с файла, вроде все работает но файл не находит, как правильно указать путь? #include...

путь к файлу - C++
скажите а можно через ехе файл установить авто поиск по всему компьютеру др ехе файла а затем его открыть ?если да приведите на...

9
mishelle92
64 / 63 / 21
Регистрация: 09.10.2012
Сообщений: 204
Завершенные тесты: 1
13.08.2014, 21:02 #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? В него все аргументы подряд запишутся. Вы уверены, что так нужно?
0
Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 22:17  [ТС] #3
erase() не просто так тут)
0
DrOffset
7471 / 4467 / 1015
Регистрация: 30.01.2014
Сообщений: 7,321
13.08.2014, 22:36 #4
Цитата Сообщение от Warezovvv Посмотреть сообщение
Передаю типа C:\\hello\\add.txt.
Прям так и передаешь в параметр командной строки? Т.е.
myapp C:\\hello\\add.txt
,
да?
0
mishelle92
64 / 63 / 21
Регистрация: 09.10.2012
Сообщений: 204
Завершенные тесты: 1
13.08.2014, 22:40 #5
Цитата Сообщение от Warezovvv Посмотреть сообщение
erase() не просто так тут)
Да, не заметил. Передал d:\my.txt,d:\my.txt - файл открывается.
1
DrOffset
7471 / 4467 / 1015
Регистрация: 30.01.2014
Сообщений: 7,321
13.08.2014, 22:42 #6
Цитата Сообщение от mishelle92 Посмотреть сообщение
Передал d:\my.txt,d:\my.txt - файл открывается.
Я думаю он передает как я написал, с экранированием. Но это не нужно делать вне исходного кода
Кажется проблема в этом.
1
Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 22:44  [ТС] #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
не робит
0
DrOffset
7471 / 4467 / 1015
Регистрация: 30.01.2014
Сообщений: 7,321
13.08.2014, 22:45 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Warezovvv Посмотреть сообщение
Ты же можешь в код сначала посмотреть, а потом спрашивать?!
Нервы отставить.
Я на другое намекаю. Ты строку передаешь с двумя слешами или с одним?

Добавлено через 20 секунд
Цитата Сообщение от Warezovvv Посмотреть сообщение
CompareFiles.exe C:\GameDev\Safty Code challenger\OriginalFiles\ass.txt
не робит
Потому что там пробелы как бы.
1
Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 22:46  [ТС] #9
Передал C:\asss.txt, заработало :|
0
DrOffset
7471 / 4467 / 1015
Регистрация: 30.01.2014
Сообщений: 7,321
13.08.2014, 22:50 #10
Цитата Сообщение от Warezovvv Посмотреть сообщение
Передал C:\asss.txt, заработал
Параметры с пробелами надо брать в кавычки.

Добавлено через 2 минуты
Warezovvv, кстати, код я твой посмотрел, даже скомпилировал и запустил на разных вариантах. Когда увидел, что он работает, то вывод остался один: что-то не так с параметрами командной строки. Вот и все
1
13.08.2014, 22:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2014, 22:50
Привет! Вот еще темы с ответами:

Путь к файлу - C++
Добрый день форумчане! Хотелось бы узнать, как указывать путь к файлу выше по каталогу. Например: *****---folder---****** ...

Путь к файлу - C++
Как сделать чтоб пользователь указывал путь к файлу который используеться дл читения?

путь к файлу - C++
скажите а возможно ехе программой открыть другой ехе файл?если да то почему не работает#include &lt;iostream&gt;//äëÿ ââîäà-âûâîäà êîóò è öèí ...

путь к файлу - C++
String x,n,v; x=Form1-&gt;Memo2-&gt;Text; // имя файла n= Form1-&gt;Memo1-&gt;Text; // имя папки v=&quot;.txt&quot;; // разрешение файла...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.