Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считка подстроки из строки в файле, Надо считать несколько символов из файла 
:(
    Опции темы
Dar
Дата 26.11.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.11.2007

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



Выручайте... 
Надо написать программку, считывающую то, что находится в текстовом файле на определенном месте...
Пишу: 
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

int main (void)
{
    FILE* f;
    char* Str;
    char* NameVal;
    char* SumVal;
    char NameStr[]=":32";
    char BufStr[128]="";
    char Test;

    if((f=fopen("f.txt","rt"))!=0)
    {
        Str=fgets(BufStr,sizeof(BufStr),f);
        while(Str!=0)
        {
            Str=strstr(BufStr,NameStr);
            if(Str!=0)
            {
                NameVal=&(Str[0]);
                NameVal=NameVal+11;
                memset(Str,0,sizeof(Str));
                strncpy(Str,NameVal,3);
                printf("%s\n",Str);
                Test=*Str;

                SumVal=NameVal+3;
                memset(Str,0,sizeof(Str));
                strncpy(Str,SumVal,16);
                printf("%s\n",Str);
            }
            Str=fgets(BufStr,sizeof(BufStr),f);
        }
        fclose(f);
    }
    printf("%s\n",Test);
    
    getch();
    return 0 ;
}

Читать, читает, на экран выводит, но сохранить (для последующего сравнения) не получается.....
 smile 
PM MAIL   Вверх
bsa
Дата 26.11.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



замени printf на fprintf (документация тебе поможет понять как именно).
PM   Вверх
JackYF
Дата 26.11.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Dar, пользуйся кнопкой "код" для оформления твоего кода, читать же неудобно.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
xvr
Дата 26.11.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Dar @ 26.11.2007,  12:06)
Выручайте... 
Надо написать программку, считывающую то, что находится в текстовом файле на определенном месте...

Давай угадаю - TC++ 3.1 ?

Код

    FILE* f;
    char* Str;
    char* NameVal;
    char* SumVal;
    char NameStr[]=":32";
    char BufStr[128]="";
    char Test;

    if((f=fopen("f.txt","rt"))!=0)
    {
        Str=fgets(BufStr,sizeof(BufStr),f);
        while(Str!=0)
        {
            Str=strstr(BufStr,NameStr);
            if(Str!=0)
            {
                NameVal=&(Str[0]);
                NameVal=NameVal+11;
                memset(Str,0,sizeof(Str));

Зануляешь указатель Str (теперь он равен NULL)

Цитата

                strncpy(Str,NameVal,3);
                printf("%s\n",Str);
                Test=*Str;

Копируешь в NULL 3 символа, распечатываешь по NULL, считываешь 1 символ по NULL - 3 раза segmentation fault

Цитата

Читать, читает, на экран выводит, но сохранить (для последующего сравнения) не получается.....
 smile

Читать, выводить а тем более сохранять из NULL получаться и не должно smile

PM MAIL   Вверх
Dar
Дата 27.11.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.11.2007

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



to JackYF: ок.

to xvr:
>Давай угадаю - TC++ 3.1 ?
Не угадал, просто задание по работе... на Си....

>Копируешь в NULL 3 символа, распечатываешь по NULL, считываешь 1 символ по NULL - 3 раза segmentation fault

Снова не угадал...  memset чистит Str, но не NameVal, а strncpy копирует первые 3-и символа NameVal в Str, так что никаких NULLов... 
Проблема в том, что бы значение полученное в этом if сохранить куда-нибудь в переменную, для дальнейшего использования, что увы, не получается... :(

to bsa: Спасибо, попробую... 


PM MAIL   Вверх
xvr
Дата 27.11.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Dar @ 27.11.2007,  10:29)
Снова не угадал...  memset чистит Str, но не NameVal, а strncpy копирует первые 3-и символа NameVal в Str, так что никаких NULLов... 

Да, с NULL я был не прав, но и ты не прав тоже - memset чистит память, КУДА УКАЗЫВАЕТ Str (причем размеров с сам Str, т.е. char*, т.е. ровно 4 байта, что совсем уже бред).

Цитата

Проблема в том, что бы значение полученное в этом if сохранить куда-нибудь в переменную, для дальнейшего использования, что увы, не получается... :(

Сделай отдельный массив и копируй туда. С за тебя память под строки выделять не будет, а указатель - это еще не строка, строка, это то, КУДА он указывает, а указывает он у тебя всегда куда то в середину BufStr
PM MAIL   Вверх
Puoar
Дата 27.11.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.11.2007

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



Цитата(xvr @  27.11.2007,  11:47 Найти цитируемый пост)
 но и ты не прав тоже - memset чистит память, КУДА УКАЗЫВАЕТ Str

Код

                memset(Str,0,sizeof(Str));

конечно не чистит но Dar имел ввиду 
Код

                memset(BufStr,0,sizeof(BufStr));

тогда чистится Str. слегка ошибся просто smile

PM MAIL   Вверх
xvr
Дата 27.11.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Puoar @ 27.11.2007,  12:22)
Цитата(xvr @  27.11.2007,  11:47 Найти цитируемый пост)
 но и ты не прав тоже - memset чистит память, КУДА УКАЗЫВАЕТ Str

Код

                memset(Str,0,sizeof(Str));

конечно не чистит но Dar имел ввиду 
Код

                memset(BufStr,0,sizeof(BufStr));

тогда чистится Str. слегка ошибся просто smile

Я не знаю, что имел в виду Dar, но написал он именно memset(Str,0,sizeof(Str));.
Кроме того, если бы он написал memset(BufStr,0,sizeof(BufStr));, то это привело бы к очистке ВСЕГО буфера вместе со всеми только что прочтенными данными, что явно не то, что он хотел smile


Это сообщение отредактировал(а) xvr - 27.11.2007, 16:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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