Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с fopen(), fprintf(), VS 2005 
V
    Опции темы
Rickert
Дата 25.11.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Вы когда-нибудь записью в файл занимались? Можете привести мне куски вашего кода?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Partizan
Дата 25.11.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



Код

//---------------------------------------------------------------------------
#include <iostream>
#include <conio>

using namespace std;

struct Player
 {
  char Surname[20];
  char Team[10];
  unsigned int Goals;
  unsigned int Passes;
  unsigned int PenaltyTime;
 }List[10],Leaders[6];
//---------------------------------------------------------------------------


int main()
{
int i,imax=0,j=0;
unsigned int max=0;
FILE *in,*out;
in=fopen("input.txt","rt");
 for (i=0;i<10;i++)
 {
   fscanf(in,"%s %s %u %u %u",&List[i].Surname,&List[i].Team,&List[i].Goals,&List[i].Passes,&List[i].PenaltyTime);
 }
fclose(in);
do
{ max=0;
  for (i=0;i<10;i++)
  {
    if ((List[i].Goals+List[i].Passes)==max)
    {
      if (List[i].PenaltyTime<List[imax].PenaltyTime)
       {
        max=List[i].Goals+List[i].Passes;
        imax=i;
       }

    }
    if ((List[i].Goals+List[i].Passes)>max)
    {
      max=List[i].Goals+List[i].Passes;
      imax=i;
    }
  }
   Leaders[j]=List[imax];
   List[imax].Goals=0;
   List[imax].Passes=0;
   j++;
}while (j!=7);
out=fopen("output.txt","wt");
  for (i=0;i<6;i++)
  {
   cout<<i+1<<")"<<Leaders[i].Surname<<" "<<Leaders[i].Team<<" "<<Leaders[i].Goals<<" "<<Leaders[i].Passes<<" "<<Leaders[i].PenaltyTime<<"\n";
   fprintf(out,"%d) %s %s %u %u %u\n",i+1,Leaders[i].Surname,Leaders[i].Team,Leaders[i].Goals,Leaders[i].Passes,Leaders[i].PenaltyTime);
   fprintf(out,"------------------------------------------------------------------------------\n");
  }
fclose(out);
getch();
}
//---------------------------------------------------------------------------



Это сообщение отредактировал(а) Partizan - 25.11.2006, 17:22


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Rickert
Дата 26.11.2006, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Partizan, я имел ввиду вывод в файл под VS 2005, значения из CString переменной.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Rickert
Дата 26.11.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Вот, что я максимум смог выжать:
Код

    CString str;
    unsigned long wlen;
    int len;

    str.Format(L"%s\\players.plrs", dirStr.GetBuffer());
    len = str.GetLength();

    HANDLE hd = CreateFile(str, GENERIC_WRITE | GENERIC_READ, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    str.Format(L"%d %s %d %s\r", tmp->name.GetLength(), tmp->name.GetBuffer(), tmp->path.GetLength(), tmp->path.GetBuffer());
    WriteFile(hd, str, len * 2, &wlen, 0);

    CloseHandle(hd);

Она пишет иногда верно, а иногда не до конца. Т.е. некоторые символы недописывает. smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
vinter
Дата 26.11.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



дай весь код лтносящийся к этому куску(все структуры и т.д)

Добавлено @ 13:28 
Код

 CString str("C:\\3.txt");    
    unsigned long wlen;    
    int len;    
    //str.Format(L"%s\\players.plrs", dirStr.GetBuffer());    
    
    HANDLE hd = CreateFile(str, GENERIC_WRITE | GENERIC_READ, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);    
    str.Format(_T("%d %s %d %s\r"),12, _T("preved"), 20 , _T("medved"));    
     len = str.GetLength() + 1;
    WriteFile(hd, str, len * sizeof(TCHAR), &wlen, 0);    
    CloseHandle(hd);


все нормально записываетsmile

Добавлено @ 13:29 
у тя проблема в том , что ты размер строки считаешь не там, и в результате получаешь , длину строки меньше чем требуется записать..


--------------------
Мой блог
PM MAIL WWW   Вверх
Rickert
Дата 26.11.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Структура:
Код

struct sPlayer
{
    sPlayer()
    {
        next = 0;
        prev = 0;
        num = 0;
    }

    sPlayer* next;
    sPlayer* prev;
    CString name;
    CString path;
    long num;
    CImage img;
};


Действительно, у меня был косяк в том, что я не ту длинну указывал. Теперь смотри. Твой вариант работает только для одного вызова WriteFile.
Делаем так:
Код

    CString str;
    unsigned long wlen;
    int len;

    str.Format(L"%s\\players.plrs", dirStr.GetBuffer());

    HANDLE hd = CreateFile(str, GENERIC_WRITE | GENERIC_READ, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    sPlayer* tmp = base.players;

    while(tmp)
    {
        str.Format(L"%d %s %d %s\n", tmp->name.GetLength(), tmp->name.GetBuffer(), tmp->path.GetLength(), tmp->path.GetBuffer());
        len = str.GetLength() + 1;
        WriteFile(hd, str, len * sizeof(TCHAR), &wlen, 0);
        tmp = tmp->next;
    }

    CloseHandle(hd);


И программа пишет туже самую билеберду.

Добавлено @ 14:02 
Да и символ конца строки не воспринемается впринципе "\n", равно как и возврат коретки "\r"
Я так понимаю, это из-за хранения в Юникоде.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
vinter
Дата 26.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



а ты уверен, что содержание tmp нормальное??
я проверить не могу у меня твоих данных нет..smile


--------------------
Мой блог
PM MAIL WWW   Вверх
vinter
Дата 26.11.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



Код

for(int i = 0; i < 20; i++)
    {
        str.Format(_T("%d %s %d %s\n"),12, _T("preved"), 20 , _T("medved"));    
        len = str.GetLength() + 1;
        WriteFile(hd, str, len * sizeof(TCHAR), &wlen, 0);    
    }

содержание файла
Цитата

12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved
12 preved 20 medved



--------------------
Мой блог
PM MAIL WWW   Вверх
Rickert
Дата 26.11.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Слушай, а у тебя какая VS? Дело в том, что под 2003 у меня всё нормально. А вот в 2005 проблемы эти появились.

Добавлено @ 15:04 
ЗЫ
Результат работы в файле с твоим циклом см. в аттаче.
1)Она все символы пишет через пробелы
2)Не воспринемает "\n"

ЗЗЫ
У меня все значения в структуре правильные. Проверяю прямо перед выполнением функции записи.


Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  123.jpg 14,85 Kb


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
vinter
Дата 26.11.2006, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 4
Всего: 56



у меня 2003, 2005 нет и проверить не могу.. так оставь в 2003:)


--------------------
Мой блог
PM MAIL WWW   Вверх
Rickert
Дата 27.11.2006, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



vinter, блин, а тему топика вообще читать не надо чтоли smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Любитель
Дата 27.11.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



1. Многие блокноты не воспринимают \n за перевод строки - нужно в дос/вин-стиле: \r\n.
2. В данном случае единицу к lrn добавлять точно не надо. WriteFile пишет побайтово. Пусть у нас есть строка "preved" (str.GetLength() == 6). Побайтово она выглядит так (нестрогий синтаксис):
Код

// без уникода
{'p', 'r', 'e', 'v', 'e', 'd', '\0'}
// с уникодом что типа:
{'\0', 'p', '\0', 'r', '\0', 'e', '\0', 'v', '\0', 'e', '\0', 'd', '\0', '\0'}

Точно как уникод коды выглядят не помню, но смысл правильный.
Ноль-символ в файл писать не надо. Посему +1 при получении длины убираем.


--------------------
PM MAIL ICQ Skype   Вверх
Earnest
Дата 27.11.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Точно, все выводится нормально: это Юникод. И, как сказал Любитель, для перевода строки нужно \r\n.
Файл-то у тебе открыт в бинарном режиме - никакой автоматической трансляции нет.


--------------------
...
PM   Вверх
Rickert
Дата 27.11.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Earnest, хорошо, тогда как записать не в юникоде? smile


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Любитель
Дата 27.11.2006, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Отключи в настройках проекта. И ещё раз повторю попробуй убрать  + 1 и поставить \r в примере 
vinter.


--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.