Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Đọc mã nguồn trang web từng dòng một bằng C++?

  1. #1
    Ngày gia nhập
    09 2010
    Bài viết
    3

    Mặc định Đọc mã nguồn trang web từng dòng một bằng C++?

    Các bro cho e hỏi làm sao đọc code 1 trang web theo từng dòng bằng C/C++ nhỉ?
    Hiện tại chuơng trình của em mới chỉ đọc được tất cả trang web đó thôi, nhưng mà em lưu nội dung page source đó vào char buffer[1000000]. Bây giờ em muốn chuơng trình của mình đọc theo kiểu line by line rồi lưu vào file dưới client thì làm thế nào ạ?

    Chuơng trình của e viết bằng C/C++ trên linux và sử dụng socket để đọc dữ liệu nhé.
    Up cả code của e lên cho mọi người dễ hình dung:
    Code:
    #include<stdio.h>
    #include<cstdlib>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<netdb.h>
    #include<netinet/in.h>
    #include<libio.h>
    #include<errno.h>
    #include<string.h>
    #include<fstream>
    
    
    void getHTTP(char * host, char * file);
    using namespace std;
    struct getUrl
    {
        char *absUrl;
        char *filedownload;
    };
    int checkURL(char * newUrl)
    {
        return 0;
    }
    void getFile(char *newUrl)
    {
        char *host = new char[300];
        char *file = new char[100];
        char *reverseFile = new char[100];
        char *reverseURL = new char[400];
        int a=0;
        for(int i= strlen(newUrl)-1; i>=0; i--)
        {
    	reverseURL[a] = newUrl[i];
    	a++;
        }
        char *pch;
        pch = (char*) memchr(reverseURL, '/', strlen(reverseURL));
        int pos =  pch - reverseURL;
        for(int i=0; i<pos; i++)
        {
    	reverseFile[i]=reverseURL[i];
        }
        a=0;
        for(int i=strlen(reverseFile)-1; i>=0; i--)
        {
    	file[a] = reverseFile[i];
    	a++;
        }
        for(int i=0; i<strlen(newUrl)-pos-1; i++)
        {
    	host[i] = newUrl[i];
        }
        //printf("\n\n%s                   i%s\n\n", file, host);
        getHTTP(host, file);
    }
    void resolveUrl(char *newUrl)
    {
        int check = 0;
        char *fch = new char[400];
        check = checkURL(newUrl);
        if(check==1)
        {
    	printf("URL khong dung chuan RFC_3896\n");
        }
        if(check == 0)
        {
    	int t=0;
    	int k;
    	for(k=7; k< strlen(newUrl); k++)
    	{
    	    fch[t] = newUrl[k];
    	    t++;
    	}
    	getFile(fch);	
        }
    }
    void getHTTP(char * host, char * file)
    {
        int Client;
        int check, port;
        struct hostent *server;
        struct sockaddr_in ClientAddress;
        char request[100];
        char buffer[1000000];
        char *pagecode;
        sprintf(request,"GET /%s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n",file,host);
        printf("%s", request);
        Client = socket(AF_INET, SOCK_STREAM, 0);
        port = atoi("80");
        server = gethostbyname(host);
        ClientAddress.sin_family = AF_INET;
        bcopy((char *)server->h_addr, (char *)&ClientAddress.sin_addr.s_addr, server->h_length);
        ClientAddress.sin_port = htons(port);
        check = connect(Client, (struct sockaddr*) &ClientAddress, sizeof(ClientAddress));
        if(check < 0)
        {
    	printf("Connecting Errors: %s\n", strerror(errno));
        }
        check = write(Client, request, sizeof(request));
        if(check < 0)
        {
    	printf("Send Request Errors: %s\n", strerror(errno));
        }
        FILE *fp = fopen("index.html","w");
        int len  = read(Client, buffer, sizeof(buffer));
        if(len < 0)
        {
    	printf("Reading Errors: %s\n", strerror(errno));
        }
        printf("\n\n\n\n%s", buffer);
        pagecode = buffer;
        //Clear request header
        /*
        char START_SOURCE[] = "<!DOCTYPE";
        char START_SOURCE2[] = "<html>";
        pagecode = strstr(buffer, START_SOURCE);
        if(pagecode == NULL)
        {
    	pagecode = strstr(buffer, START_SOURCE2);
        }
        */
        //Write to file
        fwrite(pagecode, len, 1, fp);
        fclose(fp);
        //ofstream file("index.htm");
        //file << pagecode;
        //file.close();
    }
    
    int main(int a, char *args[])
    { 
        resolveUrl(args[1]);
        
    }
    Chuơng trình nhận 1 đối số đầu vào là 1 URL chuẩn và đọc nội dung của trang web đó vd: ./http http://donganh-lienha.com/index.htm

    Mong được mọi người giúp đỡ...

  2. #2
    Ngày gia nhập
    11 2011
    Bài viết
    4

    Chào bạn,
    Mình không biết đoạn code của bạn làm sao đọc nội dung của trang web rồi lưu xuống file (do khả năng của mình hơi kém). Nhưng theo mình: cuối mỗi dòng source của trang web đều có ký tự đặt trưng để xuống dòng. Bạn nên đọc hết 1 trang, sau đó split theo ký tự xuống dòng -> ghi lại xuống file cần lưu.
    Khi mình view page source của 1 trang web bất kỳ -> save -> open by notepad++ thì mình thấy ký tự cuối cùng của nó là CRLF. Bạn có thể split theo ký tự này

    Mong có thể giúp bạn

  3. #3
    Ngày gia nhập
    09 2010
    Bài viết
    3

    Mình code cái này trên linux rồi mở file lưu được bằng gedit thì thấy nó xuống dòng ok hết rồi. Nhưng ý mình là mình muốn đọc từng dòng của cái string mà server gửi về cho mình cơ.
    Vì theo code của mình thì mình sẽ đọc 1 cái buffer to đùng char buffer[1000000]. Nhưng mình muốn chỉ đọc vừa đủ với nội dung của trang đó thôi.

  4. #4
    Ngày gia nhập
    09 2008
    Bài viết
    57

    C++ nó có hàm readline mà bạn, còn C thì đọc từng kí tự rồi kiểm tra xem nó có bằng \n thì cắt dòng thôi.
    Ghi rõ license hoặc 0 điểm

  5. #5
    Ngày gia nhập
    10 2008
    Bài viết
    258

    Trích dẫn Nguyên bản được gửi bởi kyllynk Xem bài viết
    Mình code cái này trên linux rồi mở file lưu được bằng gedit thì thấy nó xuống dòng ok hết rồi. Nhưng ý mình là mình muốn đọc từng dòng của cái string mà server gửi về cho mình cơ.
    Vì theo code của mình thì mình sẽ đọc 1 cái buffer to đùng char buffer[1000000]. Nhưng mình muốn chỉ đọc vừa đủ với nội dung của trang đó thôi.
    Cái này ngày xưa Anh đã làm cho em rồi mà lại còn xóa đi nữa.

    ý tưởng:
    Khi em đọc một website về thì nó sẽ trả về content-length trong header của trang. khi đó em tách lấy độ dài trong đây để khai báo một char[] vừa đủ.
    Anh yêu em hí hí

Các đề tài tương tự

  1. Móc Khoá Camera Siêu Nguỵ Trang.
    Gửi bởi dientuthaithang trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 216
    Bài viết cuối: 07-01-2012, 04:26 PM
  2. Phân trang 1000 dòng bằng Ajax trong ASP.net
    Gửi bởi lucathanhtam trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 15
    Bài viết cuối: 30-04-2011, 05:06 PM
  3. trang web các phần mềm nguồn mở viết bằng C++. Cho em hỏi
    Gửi bởi chuong01 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 21-05-2010, 10:10 AM
  4. Xin mã nguồn phần mềm download truyện tranh của trang Comic.Vuilen.Com
    Gửi bởi ndp1007 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 18-03-2009, 04:47 PM
  5. Mã nguồn C | Trang source codes tuyệt hay
    Gửi bởi admitmemb trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 15-11-2008, 11:59 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn