Lỗi không đọc được file khi dùng Command Line trong C++

Help me!
Khi e dùng command line thì lại không đọc được file, nhưng nếu dùng tham số dòng lệnh mặc định trong VS 2019 thì lại đọc được. E thử đặt file .txt ở thư mục khác nhưng vẫn không đọc được. Bác nào biết thì giúp e với, e xin cảm ơn.

Ban đầu e dùng fstream trong C++ nhưng không đc, chuyển qua FILE* trong C cũng vẫn không được.
Đây là code của e:

#include<iostream>
#include<string>
#include<fstream>

using namespace std;

int main(int argc, char* argv[])
{
	/*cout << argv[2];
	ifstream f;
	f.open(argv[2], ios_base::in);
	if (!f.is_open())
	{
	        cout << "\nError\n";
                return 0;
        }
	string s;
	getline(f, s);
	cout << endl << s;*/
	cout << argv[2];
	FILE* f = fopen(argv[2], "rt");
	if (!f)
		cout << "\nError";

	char a[100];
	fgets(a, 100, f);
	cout << endl << a;
	fclose(f);
	system("pause");
	return 0;
}

Có bằng chứng nào cho thấy việc bạn không đọc được file không?

2 Likes

Khi chạy command line thì nó đứng im khoảng 2s rồi i như cũ, không có gì xảy ra.

Trong file input.txt có gì không bạn, gõ more input.txt ngay folder đó xem nó ra cái gì.

Nội dung thì e chỉ có để “vuong” thôi anh

À mình nhìn vội nên không để ý, phải là argv[1]. :kissing:

argv[0] là tên script, bắt đầu từ argv[1] trở đi là ứng với argument được đưa vào.

3 Likes

không đúng anh ơi, khi em dùng tham số dòng lệnh mặc định thì nó chạy ra đúng kết quả, nhưng khi chạy cmd thì không được. Nên là argv[2] đúng. Tham số dòng lệnh em cho mặc định là vuong.exe input.txt

Bạn thử chưa mà biết không đúng. :neutral_face:
Phải dùng argv[2] thì khả năng là do bạn hoặc VS nó thêm gì đó vào vị trí 1. :smiley:

3 Likes

e thử argv[1] rồi mà không được anh ơi. Nếu dùng cmd thì nó giống như nãy, không có hiện tượng gì. Còn e chạy trong VS với tham số mặc định thì nếu dùng argv[2] nó ra đúng kết quả, dùng argv[1] nó báo lỗi, không chạy được.

Bạn vô project -> properties -> Command Arguments rồi chụp mình xem.

Nếu không đúng thì sửa lại thành input.txt.


Mình vẫn chạy bình thường. :neutral_face:

đây anh ơi

Đối chiếu với của mình để tự biết sai ở đâu nhé. :neutral_face:

Bạn hiểu thế nào là Command Arguments mà đưa cả vuong.exe vào. :smiley:

3 Likes

Yeah, cảm ơn anh nhiều nha

Cái này là do học phần ngọn (lập trình) mà không chịu học phần gốc (căn bản hệ điều hành Windows) đây chứ chẳng phải lỗi gì của C++ :smiley:

5 Likes

Có thể bạn chưa hiểu rõ cái argc và argv[] ?
Không phải lúc nào argc và argv cũng giống nhau.

Bạn hãy thử in ra toàn bộ argv, argc trong các trường hợp để thấy nó khác nhau thế nào.

3 Likes

Anh ơi, sau khi sửa lại tham số mặc định thì nó vẫn không chạy được.
Em tạo ra 1 project tương tự tên là test, copy code sang, khi chạy tham sô mặc định thì nó chạy đúng, nhưng khi chạy cmd thì lại sai.

int main(int argc, char* argv[]){
    for(int idx=0;idx<argc;idx++){
        cout<<argv[idx]<<endl;
    }
    system("pause");
    return 0;
}

Bạn chạy chương trình trên ở các trường hợp rồi post kết quả lên đây.

Một điều nữa bạn nên chú ý là các câu lệnh tương tác đường dẫn tương đối ví dụ như :

FILE *f = fopen("input.txt","rb");

thì tập tin input.txt phải nằm trong thư mục environment của ứng dụng.
Thường là nơi mà lệnh khởi động ứng dụng được gửi đi chứ không phải lúc nào cũng là thư mục chứa ứng dụng.

2 Likes

Thế nào mà bạn lại cho rằng code chạy sai?
Trong folder Debug không có file in.txt => xuất ra Error. Vậy là code chạy đúng hay chạy sai?

Như bác Thìn nói, là do bạn không chịu học kỹ căn bản của hệ điều hành.

Với lại bạn bây giờ là đang bị thụ động quá, biết có chỗ để hỏi rồi thì cứ thắc mắc gì là hỏi luôn chứ không chịu động não suy nghĩ, tìm câu trả lời trước khi hỏi.

Nên là mình sẽ tạm thời ignore các câu hỏi của bạn trong 2 tuần và cũng khuyên mọi người nên làm vậy. :smiley:


Bác Dương hơi nhầm chỗ này rồi.
argv[0] chỉ đơn thuần là script name.
Vd như gõ cmd thì cmd là script name và được đưa vào argv[0].
C:\system\stupid_program -a -b -c thì nguyên đoạn C:\system\stupid_program được đưa vào argv[0], còn -a, -b, -c lần lượt được đưa vào argv[1], argv[2], argv[3].

Còn thư mục environment mà bác đang nói đến thì là nơi mà bác gõ đoạn script trên á.

Chạy thử đoạn code này và gọi exec file theo các cách khác nhau (chỉ có tên hoặc absolute path) rồi làm tương tự như trên ở các folder khác nhau là thấy rõ à.

#include <iostream>

int main(int argc, char **argv) {
    std::cout << argv[0] << '\n';
    system("pwd");
}
6 Likes

Ừ đúng mình nhầm thật :smiley:

2 Likes

Anh ơi, do e mới có học qua cái phần File này nên cũng chưa kĩ, e đang học kỹ thuật lập trình nên các phần khác cũng chưa rõ.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?