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

[c++] fgets не могу понять почему это не работает - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
_or_75
-1 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 244
24.08.2012, 23:14     [c++] fgets не могу понять почему это не работает #1
Вообщем на диске C:\ лежит 3 файла

1 Файл test.txt
2 Файл 1.dll
3 Файл 2.dll

в test.txt записано:
1.dll
2.dll

Суть такова: считать с test.txt 2 строчки и вывести из указанных dll импортированную переменную version


Вот так не работает

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
#include <iostream>
#include <conio.h>
#include <Windows.h>
 
using namespace std;
 
inline void LOADDLL(char* FILE)
{
    int* ver;
    string (*Hud)();
    HMODULE hLib = LoadLibrary(FILE);
    (FARPROC &)ver = GetProcAddress(hLib,"version");
    (FARPROC &)Hud = GetProcAddress(hLib,"Hud");
    cout << *ver;
}
void main()
{
    FILE *DFILE;
    DFILE = fopen("C:\\test.txt","r");
    char dll[30] = "C:\\";
    char buff[30] = "";
    while(!feof(DFILE))
    {
        fgets(buff,5,DFILE);
        strcat(dll,buff);
        LOADDLL(dll);
    }
    fclose(DFILE);
    getch();
}
вот так работает но выводит только у 1.dll и то если в test.txt записано 1.dll

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.....
void main()
{
    FILE *DFILE;
    DFILE = fopen("C:\\test.txt","r");
    char dll[30] = "C:\\";
    char buff[30] = "";
    while(!feof(DFILE))
    {
        fgets(buff,5,DFILE);
        strcat(dll,buff);
    }
    LOADDLL(dll);
    fclose(DFILE);
    getch();
}
а чем проблема??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
25.08.2012, 03:34     [c++] fgets не могу понять почему это не работает #21
_or_75, Читаете не правильно,минут через 10 - 30 напишу код,сейчас занят малень )

Добавлено через 36 минут
попробуйте
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
#include <stdio.h>
#include <stdlib.h>
#include <clocale>
#include <typeinfo>
 
#define _CRT_SECURE_NO_WARNINGS
 
inline void LOADDLL(char* f)
{
    int* ver;
    string (*Hud)();
    HMODULE hLib = LoadLibrary(f);
    (FARPROC &)ver = GetProcAddress(hLib,"version");
    (FARPROC &)Hud = GetProcAddress(hLib,"Hud");
    cout << *ver;
}
 
inline void ReadDlls()
{
    FILE *f = nullptr;
        
            if((f = fopen("D:\\12.txt","r")) != NULL)
            {
                char buffDll[30] = "";
                char buffFile[30] = "";
                memset(buffFile,'\0',30);
                const char disk[] = "D:\\";
 
                while (!feof(f))
 
                    {
                    fscanf(f,"%s",buffFile);
                    strcat(buffDll,disk);
                    strcat(buffDll,buffFile);
                    LOADDLL(buffDll);//
                    memset(buffDll,'\0',30);
                    }
            }
            else
            {
                perror("Dll files");
            }
 
    fclose(f);
 
}
 
int main()
{
    setlocale(LC_ALL,".1251");
        ReadDlls();
 
    
 
    
 
 
 
    system("PAUSE");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2012, 03:44     [c++] fgets не могу понять почему это не работает #22
xADMIRALx, а в чём чтение неправильное. Судя по скринам с отладчиком, в 9 посте, путь к dll в TEST правильно прописывается.
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
25.08.2012, 04:00     [c++] fgets не могу понять почему это не работает #23
alsav22, Посмотрите еще раз внимательно на код _or_75
и проследите за переменной dll,она забивается шлаками после 1 прохода,не зря у меня в коде const disk
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2012, 06:27     [c++] fgets не могу понять почему это не работает #24
Наверное, из-за того, что fgets() считывает '\n'. В последней строке этот символ отсутствует.

Добавлено через 3 минуты
alsav22, Посмотрите еще раз внимательно на код _or_75
Я не про его код из 1 поста, он уже изменён - 6 пост [c++] fgets не могу понять почему это не работает И скрины с отладчиком посмотрите в 9 посте [c++] fgets не могу понять почему это не работает

Добавлено через 11 минут
Я бы это код так написал:
Код
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
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
inline void LOADDLL(const char* TEST)
{
    int* ver;
    string (*Hud)();
    HMODULE hLib = LoadLibrary(TEST);
    (FARPROC &)ver = GetProcAddress(hLib,"version");
    (FARPROC &)Hud = GetProcAddress(hLib,"Hud");
    cout << *ver << endl;
}
 
 
int main()
{
    
    fstream fopen("C:\\test.txt");
    if (!fopen.is_open()) cout << "Error!" << endl;
    
    string str = "C:\\";
    
    while (!fopen.eof())
    {
        string dll;
        string temp;
        
        getline(fopen, temp);
        
        dll = str + temp;
        
        LOADDLL(dll.c_str());
    } 
    
    fopen.close();
    
    system("pause");
    return 0;
}
_or_75
-1 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 244
25.08.2012, 13:13  [ТС]     [c++] fgets не могу понять почему это не работает #25
Цитата Сообщение от alsav22 Посмотреть сообщение
Наверное, из-за того, что fgets() считывает '\n'. В последней строке этот символ отсутствует.

Добавлено через 3 минуты

Я не про его код из 1 поста, он уже изменён - 6 пост [c++] fgets не могу понять почему это не работает И скрины с отладчиком посмотрите в 9 посте [c++] fgets не могу понять почему это не работает

Добавлено через 11 минут
Я бы это код так написал:
Код
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
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
inline void LOADDLL(const char* TEST)
{
    int* ver;
    string (*Hud)();
    HMODULE hLib = LoadLibrary(TEST);
    (FARPROC &)ver = GetProcAddress(hLib,"version");
    (FARPROC &)Hud = GetProcAddress(hLib,"Hud");
    cout << *ver << endl;
}
 
 
int main()
{
    
    fstream fopen("C:\\test.txt");
    if (!fopen.is_open()) cout << "Error!" << endl;
    
    string str = "C:\\";
    
    while (!fopen.eof())
    {
        string dll;
        string temp;
        
        getline(fopen, temp);
        
        dll = str + temp;
        
        LOADDLL(dll.c_str());
    } 
    
    fopen.close();
    
    system("pause");
    return 0;
}
я так понел fgets будет считывать только последнию строку файла, а первые просто пропускать
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2012, 13:22     [c++] fgets не могу понять почему это не работает #26
Цитата Сообщение от _or_75 Посмотреть сообщение
я так понел fgets будет считывать только последнию строку файла, а первые просто пропускать
Разве? Вы же выводили, что она считывает. А мой код или xADMIRALx работает? Ваши .dll для проверки выложили бы.
_or_75
-1 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 244
25.08.2012, 13:25  [ТС]     [c++] fgets не могу понять почему это не работает #27
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве? Вы же выводили, что она считывает. А мой код работает?
твой работает, спасибо.

fgets считывает, но LOADDLL берет HANDLE только последней строки test.txt, а при fstream не знаю, он просто работает
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2012, 13:45     [c++] fgets не могу понять почему это не работает #28

Не по теме:

.dll засекречены?

Дело, мне кажется, в следующем. fgets() (в отличие от getline()) считывает из потока символ '\n'. Получается, что строка, которая передаётся в LOADDLL(), заканчивается не '\0', а '\n'. Если с помощью cout << выводить то, что предаётся в LOADDLL(), всё выглядит нормально. Но cout << нормально выведет строку, если она и на '\n' заканчивается, и на '\0'. Как в функции LOADDLL() эта строка должна выглядеть, чтобы она нормально обработалась, я не знаю. Но отличие последней строки в файле от других в том, что там в конце нет '\n'. Проверить это всё точно я не могу без .dll. Можете провести такой эксперимент. В файле, поставить курсор на конец последней строки и нажать Enter. В конце последней строки теперь будет '\n'. Сохранить файл с изменениями. Проверить тот вариант кода, который нормально работал только с последней строкой. Если перестанет, то причина в этом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 13:49     [c++] fgets не могу понять почему это не работает
Еще ссылки по теме:

Не могу понять почему программа работает не правильно! C++
C++ Не могу понять почему не работает
Ребятки,выручайте,не могу понять почему не работает C++

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

Или воспользуйтесь поиском по форуму:
_or_75
-1 / 0 / 0
Регистрация: 18.02.2012
Сообщений: 244
25.08.2012, 13:49  [ТС]     [c++] fgets не могу понять почему это не работает #29
Цитата Сообщение от alsav22 Посмотреть сообщение

Не по теме:

.dll засекречены?

Дело, мне кажется, в следующем. fgets() (в отличие от getline()) считывает из потока символ '\n'. Получается, что строка, которая передаётся в LOADDLL(), заканчивается не '\0', а '\n'. Если с помощью cout << выводить то, что предаётся в LOADDLL(), всё выглядит нормально. Но cout << нормально выведет строку, если она и на '\n' заканчивается, и на '\0'. Как в функции LOADDLL() эта строка должна выглядеть, чтобы она нормально обработалась, я не знаю. Но отличие последней строки в файле от других в том, что там в конце нет '\n'. Проверить это всё точно я не могу без .dll. Можете провести такой эксперимент. В файле, поставить курсор на конец последней строки и нажать Enter. В конце последней строки теперь будет '\n'. Сохранить файл с изменениями. Проверить тот вариант кода, который нормально работал только с последней строкой. Если перестанет, то причина в этом.
я все равно об этом и думал
Yandex
Объявления
25.08.2012, 13:49     [c++] fgets не могу понять почему это не работает
Ответ Создать тему
Опции темы

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