Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Проверка имени файла


Автор: Kinch 7.4.2009, 18:56
у меня вопрос как можно сделать проверку-является ли файл текстовым, и если нет то нужно чтобы выдавалась ошибка.


так я задаю массив в 20 символов, куда нуна писать имя файла, например "file.txt"

Код

char s[20];
cin.getline(s,20);
    std::ifstream in(s);



и еще нужно сделать так чтобы вводилось только "file", те чтобы ".txt" добавлялось само. я знаю что нужно сделать проверку на наличие в массиве сивмолов ".txt"....только не магу сообразить как(( smile 

Автор: smoke_man 7.4.2009, 20:45
Можно так:
Код

#include <cstdlib>
#include <iostream>
#include <string.h>


int main(int argc, char *argv[])
{
    char *example = "file";
    char buff[30];
    strcpy(buff,example);
    if(strncmp(&example[strlen(example) - 4],".txt",4) != 0)
        strcat(buff,".txt");   
    std::cout<<buff;
    system("PAUSE");
    return EXIT_SUCCESS;
}

Автор: Kinch 7.4.2009, 21:46
не хочет работать(( окно консоли появляется, я набираю "file" дальше к нему прибавляется .txt, патом появляется строчка "для продолжения нажимите любую клавишу" и окно закрывается, а дальнейшая работа кода не происходит((

Добавлено через 1 минуту и 34 секунды
вот полный код программы, она считает пустые строки в текстовом файле


Код

#include <fstream>
#include <iostream>
#include <string>
#include <conio.h>
#include <cstdlib>
#include <string.h>
using namespace std;
int main()
{
char s[20];
cin.getline(s,20);
    std::ifstream in(s);

    {
    char *example = "file";
    char buff[30];
    strcpy(buff,example);
    if(strncmp(&example[strlen(example) - 4],".txt",4) != 0)
        strcat(buff,".txt");
    std::cout<<buff;
    //system("PAUSE");
    return EXIT_SUCCESS;
    }


    if (!in)
    {
        std::cerr << "Error. File wasn't open / exist" << std::endl;
        return -1;
    }
    std::string str;
    getline(in, str, '\032');
    std::string::size_type pos = 0, cnt = 0;
    while ((pos = str.find("\n\n", pos)) != std::string::npos)
    {
        ++pos;
        ++cnt;
    }
    if (str[0] == '\n')
        ++cnt;
    if (str[str.size() - 1] == '\n')
        ++cnt;

    std::cout << cnt << std::endl;
    getch();
    return 0;
}

Автор: Anikmar 7.4.2009, 23:02
Цитата(Kinch @  7.4.2009,  21:46 Найти цитируемый пост)
    return EXIT_SUCCESS;

Это что? Зачем?

Автор: Kinch 7.4.2009, 23:07
я хз если честно, я взял код который предложил  smoke_man, 

Автор: smoke_man 8.4.2009, 07:34
Я предложил лишь рабочее приложение с примером того,  как можно реализовать проверку на наличие ".txt" в строке. В твоем случае нужно было сделать следующее:
Код

.....
char s[20];
char buff[25];                                            //вспомогательный буфер
cin.getline(s,20);
strcpy(buff,s);                                           //Копируем в вспомогательный буфер введеную строку
if(strncmp(&s[strlen(s) - 4],".txt",4) != 0) // проверяем последние 4 символа на наличие ".txt"
       strcat(buff,".txt");                              //если ".txt" не найден, то добавляем его к строке
std::ifstream in(buff);
if(!in)
 .....
 


Автор: Anikmar 8.4.2009, 07:35
Цитата(Kinch @  7.4.2009,  23:07 Найти цитируемый пост)
я хз если честно, я взял код который предложил  smoke_man,  

Ну так немного вникните - вы же сами поставили команду закончить программу, а теперь удивляетесь почему она дальше не идет.

Автор: mrbrooks 8.4.2009, 07:56
Цитата(Kinch @  7.4.2009,  18:56 Найти цитируемый пост)
у меня вопрос как можно сделать проверку-является ли файл текстовым, и если нет то нужно чтобы выдавалась ошибка.

вопрос несколько неоднозначный. если очень захотеть, то можно любой файл открыть, как текстовый, и получить море полезной информации.


smoke_man, камрад - парсинг строки не самый лучший выход - ибо текстовый файл может быть с расширением *.dat, *.res, не говоря уж про *.fucktxt и т.п.

Автор: smoke_man 8.4.2009, 08:03
mrbrooks, согласен, но , как я понял, задача была поставлена именно на файл с расширением txt или вообще без расширения.

Автор: Anikmar 8.4.2009, 08:05
 smile 
Цитата(smoke_man @  8.4.2009,  08:03 Найти цитируемый пост)
mrbrooks, согласен, но , как я понял, задача была поставлена именно на файл с расширением txt или вообще без расширения. 

Я иногда медлено обалдеваю от "полезности" таких задач. И много знаний она прибавляет?

Автор: mrbrooks 8.4.2009, 08:07
smoke_man, это да. 
я к тому, что вопрос несколько неоднозначный сам по себе и таит в себе кучу встречных вопросов  smile

Добавлено через 1 минуту и 32 секунды
Цитата(Anikmar @  8.4.2009,  08:05 Найти цитируемый пост)
Я иногда медлено обалдеваю от "полезности" таких задач. И много знаний она прибавляет? 

Я то же не догоняю. 

Автор: Kinch 8.4.2009, 08:38
всем спс)) все работает))

Автор: xvr 8.4.2009, 10:39
Цитата(smoke_man @ 7.4.2009,  20:45)
Можно так:
Код

#include <cstdlib>
#include <iostream>
#include <string.h>


int main(int argc, char *argv[])
{
    char *example = "file";
    char buff[30];
    strcpy(buff,example);
    if(strncmp(&example[strlen(example) - 4],".txt",4) != 0)
        strcat(buff,".txt");   
    std::cout<<buff;
    system("PAUSE");
    return EXIT_SUCCESS;
}

Если длинна имени файла (вместе с расширением) будет меньше 4х, то работать не будет - конструкция &example[strlen(example) - 4] выйдет за начало строки example

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)