Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 06:54   #1
protiv
 
Регистрация: 11.12.2012
Сообщений: 6
По умолчанию Fopen.

Здравствуйте!
Хочу сделать открытие/чтение всех файлов в папке.
Собственно код программы:
Код:
TCHAR szPath[MAX_PATH]; 
lstrcpy(szPath, _T("C:\\n\\*.*"));
WIN32_FIND_DATA fd; 
HANDLE hf = FindFirstFile(szPath, &fd);
 if ( hf != INVALID_HANDLE_VALUE ) 
  { 
    do 
    { 
      if ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) 
      { 
        if ( lstrcmp(fd.cFileName, _T(".")) && lstrcmp(fd.cFileName, _T("..")) ) 
        { 
		
        } 
      } 
      else 
      { 
		  u2=char("C:\\n\\")+(char)fd.cFileName;
		  FILE* fp1 = fopen(&u2,"r+"); //Как записать полный путь к файлу?
		  if(fp1 != NULL) {cout<<"ok";}
      } 
    } while (FindNextFile(hf, &fd)); 
    FindClose(hf); 
  }
Конечно обычная запись работает:
Код:
FILE* fp = fopen("C:\\n\\1.txt","r");
но мне надо что то вроде этого:
Код:
u2=char("C:\\n\\")+(char)fd.cFileName;
FILE* fp1 = fopen(&u2,"r+");
т.е. открывать файлы по очередности

и еще вопрос почему когда я вывожу имя файла:
Код:
printf("\t% s\n", fd.cFileName);
выводится только первая буква имени?
protiv вне форума Ответить с цитированием
Старый 11.12.2012, 09:01   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

strcpy()
strcat()
или можно их WIN32 альтернативы
lstrcpy()
lstrcat()
waleri на форуме Ответить с цитированием
Старый 11.12.2012, 22:33   #3
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

как и сказали выше
но можешь перейти на string или wstring в зависимости от таблицы кодировки проекта. морочек просто меньше....

Код:
#include <iostream>
#include <string.h>

std::string name = "Чему то там".
чем хорош. ты не паришься по поводу объёма памяти и удаление её. а также для добавления в конец есть фуна
Код:
hame.append("Чё то там");
А что бы WinApi функции тебя понимали, ибо им нуно char
Код:
name.c_str();
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 06:13   #4
protiv
 
Регистрация: 11.12.2012
Сообщений: 6
По умолчанию

Делаю так:
Код:
char *u2="C:\\ntp\\";
 char  buf[42];
 memset(buf, 0, sizeof(buf));
 strcpy(buf,(char *)fd.cFileName);
 strcat(u2,buf);
FILE* fp1 = fopen(u2,"r"); 
if(fp1 != NULL) {cout<<" sdf";}
выдает ошибку
protiv вне форума Ответить с цитированием
Старый 12.12.2012, 06:31   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

какую же ошибку?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.12.2012, 06:41   #6
protiv
 
Регистрация: 11.12.2012
Сообщений: 6
По умолчанию

Необработанное исключение в "0x1026f6d7 (msvcr90d.dll)" в "df.exe": 0xC0000005: Нарушение прав доступа при записи "0x00418883".
protiv вне форума Ответить с цитированием
Старый 12.12.2012, 09:01   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

strcat(u2,buf);
Читаем внимательно что к чему добавляется.
waleri на форуме Ответить с цитированием
Старый 12.12.2012, 11:36   #8
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Во первых запись
Код:
char *u2="C:\\ntp\\"; /// неверная
char  buf[42]; // мало памяти
Переделал твой пример
Код:
char fn[MAX_PATH];
strcpy(fn, "C:\\ntp\\");
strcat(fn,fd.cFileName);
FILE* fp1 = fopen(u2,"r"); 
if(fp1 != NULL) {cout<<" sdf";}
заработает в мультибитной кодировке.
иначе fd.cFileName является UNICODE и тут нужно переделать под UNICODE
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 11:42   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Чтобы не париться по поводу кодировок

Код:
#include <tchar.h>

TCHAR fn[MAX_PATH];
_tcscpy(fn, TEXT("C:\\ntp\\"));
_tcscat(fn,fd.cFileName);
FILE* fp1;
#ifndef UNICODE
 fp1 = fopen(fn,TEXT("r")); 
#else
 fp1 = wfopen(fn,TEXT("r"));
#endif
if(fp1 != NULL) {cout<<TEXT(" sdf");}
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 12.12.2012 в 12:19. Причина: Установил везде макрос TEXT
Perchik71 вне форума Ответить с цитированием
Старый 13.12.2012, 03:56   #10
protiv
 
Регистрация: 11.12.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Во первых запись
Код:
char *u2="C:\\ntp\\"; /// неверная
char  buf[42]; // мало памяти
Переделал твой пример
Код:
char fn[MAX_PATH];
strcpy(fn, "C:\\ntp\\");
strcat(fn,fd.cFileName);
FILE* fp1 = fopen(u2,"r"); 
if(fp1 != NULL) {cout<<" sdf";}
заработает в мультибитной кодировке.
иначе fd.cFileName является UNICODE и тут нужно переделать под UNICODE
Выдает ошибку:strcat: невозможно преобразовать параметр 2 из 'WCHAR [260]' в 'const char *'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast
protiv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
непонятное поведение fopen frommars PHP 9 18.10.2012 13:07
fopen возвращает NULL. BAH--zer Общие вопросы C/C++ 1 07.05.2012 13:13
не работает fopen() vedro-compota PHP 3 19.04.2012 15:25
fopen Китос Общие вопросы C/C++ 1 29.10.2011 02:14
Ошибка с функцией fopen motorway PHP 0 29.07.2009 17:30