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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2011, 00:04   #1
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
Вопрос Аргументы командной строки

Вот учусь я по книге "C++ без страха!"
И там есть такая тема как "Аргументы командной строки"! Вот и собственно пример этой программы над которой я работаю.
Код:
#include "iostream"
#include "string.h"
#include "fstream"
using namespace std;

int main (int argc, char *argv[]) {
	int c, i;
	char filename[81];
	char input_line[81];
	if (argc > 1) {
		strncpy(filename, argv[1], 80); }
	else {
		cout << "Enter a file name and press ENTER: ";
		cin.getline(filename, 80);
	}
	ifstream file_in(filename);
	if (! file_in) {
		cout << "Could not open file " << filename << endl;
		return -1;
	}
	while (1) {
		for (i = 1; i <= 24 && ! file_in.eof(); i++) {
			file_in.getline(input_line, 80);
			cout << input_line;
		}
		if (file_in.eof())
			break;
		cout << endl;
		cout << "More? (press 'Q' and ENTER to quit): ";
		cin.getline(input_line, 80);
		c = input_line[0];
		if (c == 'Q' || c == 'q')
			break;
	}
	return 0;
}
Запускаю я эту программу через командную строку windows, пишу путь к программе и имя файла который она должна открыть, она все запускается только по каким то причинам не открывает файл который ей нужно прочитать. А если зайти в этот проект и запустить скомпилированную программу, она работает просто отлично и все открывает. Подскажите пожалуйста в чем собственно проблема, я уже 100 раз смотрю вроде в коде все отлично!

Вот первый скрин:

Здесь все запускается через командную строку windows и почему то не работает.

А вот второй скрин:

А здесь прямой запуск программы и все работает на ура!
Sadist989 вне форума Ответить с цитированием
Старый 22.06.2011, 01:38   #2
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Цитата:
почему то не работает.
потому что нужно писать полный путь к файлу, т.е. если хотите открыть файл из своей директории (как вы собственно и хотели сделать) - нужно естественно в коде дописывать "путь программы + argv[1]".
Реализация:
Код:
	if (argc > 1) {
		if (argv[1][1] == ':' && argv[1][2] == '\\')
		{
			strcpy(filename, argv[1]);
		}
		else
		{
			char addtopath[] = {"\\"};
			GetCurrentDirectory(81, filename);
			strcat(filename, addtopath);
			strcat(filename, argv[1]);
		}
	}

Последний раз редактировалось zotox; 22.06.2011 в 02:27.
zotox вне форума Ответить с цитированием
Старый 22.06.2011, 01:51   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

глупо делать это в коде, если уж файл должен указыватся.

ТС, у вас какая текущая директория?
system32, у вас в ней есть file.txt?
не забывайте что относительные пути ищутся относительно текущей директории, а не в папке программы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.06.2011, 02:43   #4
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Цитата:
system32, у вас в ней есть file.txt?
Даже если он был бы то все равно не открылся (как показано на первом скрине).
zotox вне форума Ответить с цитированием
Старый 22.06.2011, 03:01   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почему же нет?
по относительному пути ОС бы искала файл ..\system32\file.txt
если б он там был то открылся бы.

в первом скрине файла в текущей директории нет.

PS: бедные мои утилитки, они не знают что они не должны открывать файлы так
PPS: ОС по сути делает то же самое что вы написали в своем коде, зачем дублировать действия?
но в вашем варианте, получается не возможным указать относительный путь.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.06.2011 в 03:13.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.06.2011, 03:20   #6
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
почему же нет?
Код:
Код:
	if (argc > 1) {
		strcpy(filename, argv[1]);
	}
	else
	{
		strcpy(filename, "aaaa.txt");//файл который существует в папке с программой
	}
	ifstream file_in(filename);
	if (! file_in) {
		cout << "Could not open file " << filename << endl;
		return -1;
	}
Содержимое aaaa.txt: hello world
Логи командой строки:

1. Открытие самой программы
Код:
C:\Users\adm\Documents\Visual Studio 2008\Projects\temp_6\Debug>temp_6.exe
hello world:)
2. Открытие aaaa.txt
Код:
C:\Users\adm\Documents\Visual Studio 2008\Projects\temp_6\Debug>temp_6.exe aaaa.
txt
hello world:)
3. Переход в каталог system32
Код:
C:\Users\adm\Documents\Visual Studio 2008\Projects\temp_6\Debug>cd c:\windows\system32\
4. Запуск программы
Код:
c:\Windows\System32>"C:\Users\adm\Documents\Visual Studio 2008\Projects\temp_6\D
ebug\temp_6.exe"
Could not open file aaaa.txt
5. Открытие aaaa.txt (который не существует в system32)
Код:
c:\Windows\System32>"C:\Users\adm\Documents\Visual Studio 2008\Projects\temp_6\D
ebug\temp_6.exe" aaaa.txt
Could not open file aaaa.txt
6. Открытие test_temp.txt (который существует в system32, но не существует в папке с программой)
Код:
c:\Windows\System32>"C:\Users\adm\Documents\Visual Studio 2008\Projects\temp_6\D
ebug\temp_6.exe" test_temp.txt
Could not open file test_temp.txt
zotox вне форума Ответить с цитированием
Старый 22.06.2011, 03:40   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc,char**argv)
{
	if (argc > 1) {
	}
	else
	{
		cout<<"Opening aaa.txt";
		return 0;
	}
	ifstream file_in(argv[1]);
	if (! file_in) 
	{
		cout << "Could not open file " << argv[1] << endl;
		return -1;
	}
	cout<<"File: "<<argv[1]<<" Opened"<<endl;
	string s;
	getline(file_in,s);
	cout<<s;
}
Цитата:
D:\coding>1.exe 1.cpp
File: 1.cpp Opened
#include <iostream>
рядом с exe, и относительный путь тот же.
Цитата:
D:\coding>1.exe ..\1.cpp
File: ..\1.cpp Opened
#include <iostream>
файл не рядом с exe, путь относительный, совпадает с путем exe.
Цитата:
D:\>E:

E:\>D:\coding\1.exe 1.cpp
File: 1.cpp Opened
#include <iostream>
текущая папка E:, файл в ней, приложение в папке D:\coding\
все отлично открывает.(тут специально вырезал файл, рядом с приложением его нет)

какой еще вам тест нужен?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.06.2011 в 03:44.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.06.2011, 04:03   #8
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Цитата:
все отлично открывает.
В этом случае я согласен.

Но:
По поводу того откроется ли файл из под windows\system32 то:
В XP: согласен, он откроется. В windows 7: под вопросом.

Последний раз редактировалось zotox; 22.06.2011 в 06:27.
zotox вне форума Ответить с цитированием
Старый 22.06.2011, 07:54   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

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

а править ручками пути...в вашем коде так же доступ не появится.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.06.2011, 12:53   #10
Sadist989
Пользователь
 
Аватар для Sadist989
 
Регистрация: 12.08.2010
Сообщений: 14
Хорошо

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ТС, у вас какая текущая директория?
system32, у вас в ней есть file.txt?
не забывайте что относительные пути ищутся относительно текущей директории, а не в папке программы.
Вот все сделал поместил программу(readtxt2.exe) и файл (read.txt) на диск C:\ и зашел в командную строку windows. Там прописал cd C:\ и перешол в корень диска C:\, потом прописал C:\readtxt2 read.txt и ура все заработало
___________________________
Спасибо zotox и Пепел Феникса, помогли мне разобраться

Последний раз редактировалось Sadist989; 22.06.2011 в 13:17. Причина: забыл сказать спасибо!
Sadist989 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
распознавание командной строки danzel1 Общие вопросы C/C++ 2 10.06.2011 15:50
аргументы командной строки ololo-schoolboy Общие вопросы C/C++ 2 19.05.2011 22:50
аргумент командной строки DeFace Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 06.09.2010 22:10
Аргументы командной строки в Boost.test nazavrik Общие вопросы C/C++ 0 18.02.2010 17:23
параметры командной строки. nazavrik Общие вопросы C/C++ 4 20.11.2009 20:15