Модератор: Модераторы разделов
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora
Сообщение
Corsair » 08.04.2008 17:16
Есть небольшая программка, которая выводит содержимое каталога. Мне надо скрыть из вывода служебные файлы . и .. Чего может быть проще...
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
//#include "SDL.h"
//#include "SDL_mixer.h"
//Mix_Music *music = NULL;
void die(char *);
int main(int argc, char *argv[]) {
DIR * dir;
struct dirent * ent;
int filenumb = 1;
if (argc != 2){
fprintf(stderr, "Usage: %s <path>\n", argv[0]);
exit(-1);
}
if(!(dir = opendir(argv[1]))) die("opendir");
errno = 0;
while ((ent = readdir(dir))) {
if (ent->d_name == "." || ent->d_name == "..") continue;
printf("%i.\t%s\n",filenumb,ent->d_name);
filenumb++;
errno = 0;
}
if(errno) die("readdir");
closedir(dir);
}
void die(char * message){
perror(message);
exit(1);
}
Но не тут то было.
Корень зла вот эта строка: if (ent->d_name == "." || ent->d_name == "..") continue;
Я, как человек, сильно испорченный PHP, не понимаю почему на С это условие не выполняется. При чем эти файлы в выводе присутствуют.
Буду признателен за помощь.
Жестокий стоячий админ (с) коллега
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10
Сообщение
BlackStar » 08.04.2008 17:32
В "C" нет типа "строка", используй strcmp().
LightLang Team
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora
Сообщение
Corsair » 08.04.2008 20:47
BlackStar , благодарствую, все получилось.
Жестокий стоячий админ (с) коллега
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora
Сообщение
Corsair » 10.04.2008 11:56
В гробу я видел этот С. Не думал что все настолько неудобно. Переписал все на С++ - небо и земля. Только сейчас понял сколько разработчиков принесли себя в жертву UNIX.
Код: Выделить всё
#include <dirent.h>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
void die (string message){
cerr << message <<endl;
exit(-1);
}
int getdircontents (string dir, vector<string> &files){
DIR *dp;
struct dirent *entp;
if((dp = opendir(dir.c_str())) == NULL) die("opendir() error");
while ((entp = readdir(dp)) != NULL) {
if (string(entp->d_name) == "." || string(entp->d_name) == "..") continue;
files.push_back(string(entp->d_name));
}
closedir(dp);
return 0;
}
int main(int argc, char **argv){
if (argc != 2) die("Usage: " + string(argv[0]) + " <path>");
string dir = string(argv[1]);
vector<string> files = vector<string>();
getdircontents(dir,files);
for (int i = 0;i < files.size();i++)
cout << i+1 << "\t" << files[i] << endl;
return 0;
}
Жестокий стоячий админ (с) коллега
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10
Сообщение
BlackStar » 10.04.2008 12:46
Да ну, на С код более простой и понятный. А если хочется изящества:
Код: Выделить всё
#!/usr/bin/env python
import sys
import os
def visit(arg, root, fnames):
for name in fnames:
print name
os.path.walk(sys.argv[1], visit, None)
код на питоне, делает тоже самое.
LightLang Team
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Сообщение
serzh-z » 10.04.2008 12:49
Corsair писал(а): ↑ 10.04.2008 11:56
Только сейчас понял сколько разработчиков принесли себя в жертву UNIX.
Можно подумать, что std::string сам собою образовался и является чем-то другим, нежели написанной автором STL обёрткой вокруг тех же байтовых массивов. -)
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora
Сообщение
Corsair » 10.04.2008 20:53
BlackStar , к сожалению учить сейчас абсалютно новые для меня языки нет времени, да, признаться, и желания.
serzh-z , да я это все прекрасно понимаю, просто я слишком ленив. И уж конечно проникся большим уважением к тем людям, которые создали все эти "вкусности" для таких как я=)
Жестокий стоячий админ (с) коллега