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

Đề tài: hỏi về tìm kiếm trên file text?

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

    Mặc định hỏi về tìm kiếm trên file text?

    các bác cho em hỏi chút: giả sử em có một file text trong đó lưu các thông tin như họ tên, quê quán, năm sinh....của nhiều người, em cần lập trình một chương trình C++ để thực hiện tìm kiếm trên file text đó, giả sử như khi đánh vào họ tên thì sẽ hiện ra tất cả thông tin về người đó!
    Em đã thử, nhưng chỉ tìm được dữ liệu ở dạng số, còn dữ liệu dạng kí tự (như họ và tên) thì lại không được, mong các bác chỉ giúp! em cảm ơn trước nha!
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 21-04-2008 lúc 01:54 AM. Lý do: Vui lòng đọc Nội quy trước khi gửi bài viết lên diễn đàn

  2. #2
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Mình nghĩ rằng ko thể nào tìm kiếm trực tiếp trên file được mà bắt buộc bạn phải lưu những thông tin đó vào bộ nhớ và thực hiện việc tìm kiếm trên bộ nhớ ấy.

    Theo như bài của bạn thì bạn nên khai báo 1 cấu trúc của một người bao gồm họ tên quê quán ... Sau đó lưu những thứ đọc được trên tệp vào mảng cấu trúc ấy . Chú ý nên lưu theo kiểu nhị phân thì sẽ chuẩn hơn. Bạn thử chạy code này sẽ hiểu cách thức làm việc hơn :

    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<string.h>
    4. #include<dos.h>
    5. #include<stdlib.h>
    6.  
    7. typedef struct sinhvien{
    8.             char ht[20];
    9.             int d;
    10.                };
    11.  
    12. FILE *p;
    13.  
    14. sinhvien *svien;
    15.  
    16. int size=sizeof(sinhvien),n;
    17.  
    18. void laptep(char *ten);
    19. void doctep(char *ten);
    20.  
    21. void laptep(char *ten)
    22. {
    23.  sinhvien sv;
    24.  
    25.  p=fopen(ten,"wb");
    26.  
    27.  fflush(stdin);
    28.  while(1)
    29.  {
    30.   gets(sv.ht);
    31.   if(sv.ht[0]=='\0') break;
    32.   scanf("%d",&sv.d);
    33.   fwrite(&sv,size,1,p);
    34.   fflush(stdin);
    35.  }
    36.  
    37.  fclose(p);
    38. }
    39.  
    40. void doctep(char *ten)
    41. {
    42.  sinhvien sv;
    43.  
    44.  p=fopen(ten,"rb");
    45.  fseek(p,0,2);
    46.  n=ftell(p)/size;
    47.  rewind(p);
    48.  svien=(sinhvien*)calloc(n,size);
    49.  fread(svien,size,n,p);
    50.  
    51.  fclose(p);
    52. }
    53.  
    54. void main()
    55. {
    56.  char ten[50];
    57.  int i;
    58.  clrscr();
    59.  printf("nhap ten tep:");
    60.  gets(ten);
    61.  
    62.  laptep(ten); //ban phai lap mot tep truoc tu ban phim
    63.  doctep(ten); // sau do doc tep ban vua moi lap
    64.  
    65.  for(i=0;i<n;i++)
    66.  printf("%s %d\n",(svien+i)->ht,(svien+i)->d); // in ra man hinh danh sach sinh vien
    67.  
    68.  getch();
    69. }

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Vì string C++ là case-sensitive, nên khi cậu type cả đoạn gồm họ và tên nó sẽ tính cả độ dài, vì vậy nó sẽ không cho cậu kết quả. Ví dụ cậu thử đoạn code sau : nếu cậu chỉ type vào họ nó sẽ cho ra chính xác, nếu cậu type cả tên thì banh xác T_T
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <vector>
    4. #include <algorithm>
    5. #include <fstream>
    6.  
    7. void eat_endline(std::string &str){
    8.   std::size_t len_of = str.length();
    9.   if(len_of > 0 && str[len_of - 1] == '\n')
    10.     str = str.substr(0, len_of - 1);
    11. }
    12.  
    13. int main()
    14. {
    15.   std::fstream client_file;
    16.   std::vector<std::string> database;
    17.   client_file.open("abc.txt");
    18.   std::string client_name;
    19.  
    20.   while(client_file >> client_name)
    21.   {
    22.     eat_endline(client_name);
    23.     database.push_back(client_name.c_str());
    24.   }
    25.  
    26.     std::string find_term;
    27.     std::getline(std::cin, find_term);
    28.   std::sort(database.begin(), database.end());
    29.     if(std::binary_search(database.begin(), database.end(), find_term.c_str())){
    30.         std::cout << "found !\n";
    31.     }
    32.     else{
    33.       std::cout << "not found !\n";
    34.     }
    35. }
    Muốn tìm chính xác thì phải dùng kĩ thuật sau đây, derived từ lớp mà string C++ ra đời tức là
    class : public std::char_traits<char>.
    Example :
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <vector>
    4. #include <algorithm>
    5. #include <cctype>
    6. #include <fstream>
    7.  
    8. struct ci_char_traits : public std::char_traits<char>{
    9.   static
    10.   bool eq(char c1, char c2){
    11.     return std::tolower(c1) == std::tolower(c2);
    12.   }
    13.  
    14.   static
    15.   bool ne(char c1, char c2){
    16.     return std::tolower(c1) != std::tolower(c2);
    17.   }
    18.  
    19.   static
    20.   bool lt(char c1, char c2){
    21.     return std::tolower(c1) < std::tolower(c2);
    22.   }
    23.  
    24.   static
    25.   int compare(const char* s1, const char* s2, size_t n){
    26.     for(;*s1 && *s2; ++s1, ++s2){
    27.       int diff = std::tolower(*s1) - std::tolower(*s2);
    28.       if(diff)
    29.         return diff;
    30.     }
    31.     return (*s1 != '\0') - (*s2 != '\0');
    32.   }
    33.  
    34.   static
    35.   const char* find( const char* s, int n, char a ){
    36.     while(n-- > 0 && std::tolower(*s) != std::tolower(a)){
    37.       ++s;
    38.     }
    39.     return n >= 0 ? s : 0;
    40.   }
    41. };
    42.  
    43. typedef std::basic_string<char, ci_char_traits> ci_string;
    44. typedef std::vector<ci_string> s_string;
    45.  
    46. void print_data(s_string& con){
    47.   for(s_string::const_iterator it = con.begin(); it != con.end(); ++it){
    48.     std::cout << (*it).c_str() << "\n";
    49.   }
    50. }
    51.  
    52. void eat_endline(std::string &str){
    53.   std::size_t len_of = str.length();
    54.   if(len_of > 0 && str[len_of - 1] == '\n')
    55.     str = str.substr(0, len_of - 1);
    56. }
    57.  
    58. int main() {
    59.   s_string database;
    60.   std::fstream client_file;
    61.   client_file.open("abc.txt");
    62.   char advance;
    63.   std::string name;
    64.  
    65.   while(std::getline(client_file, name)){
    66.     eat_endline(name);
    67.     database.push_back(name.c_str());
    68.   }
    69.   std::sort(database.begin(), database.end());
    70.   print_data(database);
    71.   s_string::iterator pos;
    72.   do{
    73.     std::cout << "Enter search string: " << std::flush;
    74.     std::string item;
    75.     std::getline(std::cin, item);
    76.     eat_endline(item);
    77.     if(std::binary_search(database.begin(), database.end(), item.c_str())){
    78.       std::cout << "Item found : " << item.c_str() << "\n";
    79.     }
    80.     else{
    81.       std::cout << "Item not found .\n";
    82.       print_data(database);
    83.     }
    84.     std::cout << "Continue (y, n) ? : ";
    85.     std::cin >> advance;
    86.     std::cin.ignore(80, '\n');
    87.   }while(advance == 'y' || advance == 'Y');
    88. }

    Windows Style T_T:
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <vector>
    4. #include <algorithm>
    5. #include <cctype>
    6. #include <fstream>
    7.  
    8. struct ci_char_traits : public std::char_traits< char >
    9. {
    10.     static
    11.     bool eq( char c1, char c2 )
    12.     {
    13.         return std::tolower( c1 ) == std::tolower( c2 );
    14.     }
    15.  
    16.     static
    17.     bool ne(char c1, char c2)
    18.     {
    19.         return std::tolower( c1 ) != std::tolower( c2 );
    20.     }
    21.  
    22.     static
    23.     bool lt(char c1, char c2)
    24.     {
    25.         return std::tolower( c1 ) < std::tolower( c2 );
    26.     }
    27.  
    28.     static
    29.     int compare( const char* s1, const char* s2, size_t n )
    30.     {
    31.         for( ;*s1 && *s2; ++s1, ++s2 )
    32.         {
    33.             int diff = std::tolower( *s1 ) - std::tolower( *s2 );
    34.             if( diff )
    35.                 return diff;
    36.         }
    37.         return ( *s1 != '\0' ) - ( *s2 != '\0' );
    38.     }
    39.  
    40.     static
    41.     const char* find( const char* s, int n, char a )
    42.     {
    43.         while( n-- > 0 && std::tolower( *s ) != std::tolower( a ) )
    44.         {
    45.             ++s;
    46.         }
    47.         return n >= 0 ? s : 0;
    48.     }
    49. };
    50.  
    51. typedef std::basic_string< char, ci_char_traits > ci_string;
    52. typedef std::vector< ci_string > s_string;
    53.  
    54. void print_data( s_string& con )
    55. {
    56.     for( s_string::const_iterator it = con.begin( ); it != con.end( ); ++it )
    57.     {
    58.         std::cout << (*it).c_str() << "\n";
    59.     }
    60. }
    61.  
    62. void eat_endline( std::string &str )
    63. {
    64.     std::size_t len_of = str.length( );
    65.     if( len_of > 0 && str[ len_of - 1 ] == '\n' )
    66.     str = str.substr( 0, len_of - 1 );
    67. }
    68.  
    69. int main( )
    70. {
    71.     s_string           database;
    72.     std::fstream       client_file;
    73.     char               advance;
    74.     std::string        name;
    75.     s_string::iterator pos;
    76.     client_file.open("abc.txt");
    77.  
    78.   while( std::getline( client_file, name ) )
    79.   {
    80.       eat_endline( name );
    81.       database.push_back( name.c_str( ) );
    82.   }
    83.  
    84.   std::sort( database.begin(), database.end( ) );
    85.    
    86.   print_data( database );
    87.  
    88.   do
    89.   {
    90.       std::cout << "Enter search string: " << std::flush;
    91.       std::string item;
    92.    
    93.       std::getline( std::cin, item );
    94.       eat_endline( item );
    95.    
    96.       if( std::binary_search( database.begin( ), database.end( ), item.c_str( ) ) )
    97.       {
    98.           std::cout << "Item found : " << item.c_str( ) << "\n";
    99.       }
    100.    
    101.       else
    102.       {
    103.           std::cout << "Item not found .\n";
    104.           print_data( database );
    105.       }
    106.    
    107.       std::cout << "Continue (y, n) ? : ";
    108.       std::cin >> advance;
    109.       std::cin.ignore( 80, '\n' );
    110.   }
    111.   while( advance == 'y' || advance == 'Y' );
    112.  
    113.   return 0;
    114. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 17-04-2008 lúc 02:55 AM.

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

    cảm ơn các bác, em sẽ về thử xem!
    với cách làm như vậy thì liệu với một CSDL lớn, mình có thể giải quyết được không ạ?
    Có gì mong các bác giúp đỡ nhiều!
    Thanks!

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    cảm ơn các bác, em sẽ về thử xem!
    với cách làm như vậy thì liệu với một CSDL lớn, mình có thể giải quyết được không ạ?
    Có gì mong các bác giúp đỡ nhiều!
    Thanks!
    Dữ liệu cậu lớn cả nào thì tui chịu, vì tui không rành về xử lý Database lắm cậu có thể hỏi trong mục Database, nếu cậu viết cho bài học ở trường lớp thì tui nghĩ cũng không đến nỗi, dùng luôn vector<data> để lưu dữ liệu cho tiện, vì vector cậu không phải lo việc release memory.

  6. #6
    Ngày gia nhập
    12 2006
    Bài viết
    72

    Mặc định hỏi về tìm kiếm trên file text?

    Trích dẫn Nguyên bản được gửi bởi nguoiduca Xem bài viết
    cảm ơn các bác, em sẽ về thử xem!
    với cách làm như vậy thì liệu với một CSDL lớn, mình có thể giải quyết được không ạ?
    Có gì mong các bác giúp đỡ nhiều!
    Thanks!
    Đối với một CSDL lớn người ta phải tạo ra hẳn một bộ phần mềm như SQL Server hay Oracle để làm việc với chúng. Theo suy nghĩ của bạn thì có thể thực hiện được nếu vấn để dung lượng bộ nhớ, bảo mật, tốc độ, đồng bộ dữ liệu,dư thừa dữ liệu và một số vấn để khác được bỏ qua. Mong rằng bạn sẽ làm ra một phần mềm như SQL Server của người Việt

  7. #7
    Ngày gia nhập
    04 2008
    Bài viết
    3

    to rox_rook and sieuphuong: Cảm ơn các bác nhiều, nhưng các bác có thể giải thích rõ hơn các phần trong chương trình được không ạ? em đã xem nhưng chưa hiểu lắm!
    Vẫn là bài toán lần trước, em đã lưu nội dung file text vào bộ nhớ đệm bằng đoạn lệnh sau:

    char buffer[256];
    ifstream myfile ("vidu1.txt");

    while (! myfile.eof() )
    {
    myfile.getline (buffer,100);
    }

    Em đã tìm trong các sách về C và C++ nhưng không thấy các hàm mà mình cần, Các bác có thể chỉ giúp em một số hàm sau được không ạ!
    - đọc dữ liệu có trên một dòng. Giả sử dòng text (đã lưu trong buffer) là: Ho va ten: Nguyen Van A, thì làm sao để in ra màn hình cả dòng đó (có hàm nào không ạ?, có hàm scanf gì đó nhưng nó chỉ in ra phần kí tự đến khi gặp dấu cách). Nếu dùng lệnh cout<<buffer; thì nó sẽ in ra nội dung cả file text đó!
    - các dòng text được lưu vào buffer dưới dạng một xâu kí tự, vậy làm thế nào để duyệt tuần tự xâu đó từ đầu đến cuối (trong ví dụ trên thì em muốn lọc ra riêng phần "Nguyễn Văn A" --> tìm ra kí tự ":" và sau đó làm thế nào để copy phần text sau dấu ":" cho đến khi gặp 2 dấu cách liền nhau thì dừng!)
    tạm thời là một số hàm đó đã, các bác chỉ giúp em với!
    to bác thangtran: em muốn sau khi đã lọc được dữ liệu từ file text (các trường họ tên, quê quán...) thì sẽ kết nối với một hệ quản trị CSDL, hệ QTCSDL này sẽ tự động đánh chỉ mục và ta sẽ thực hiện tìm kiếm trên hệ thống chỉ mục được tạo ra đó, nhưng đó mới chỉ là tương lai!, tất nhiên là ứng dụng trên một CSDL lớn, không thể dùng được cấu trúc mảng trong C được! bác có kinh nghiệm gì mách em với! thanks bác nhiều!

  8. #8
    Ngày gia nhập
    04 2008
    Bài viết
    12

    Đọc hết một dòng thì bạn có thể dùng kiểu này
    PHP Code:
    fgets(str(tên xâu kí tự), n(sẽ đọc đến n-1 kí tự),f(con trỏ file)); 
    cái này khi gặp dấu Enter thì nó sẽ dừng lại hoặc là đọc đủ n-1 kí tự và biến str.

    các dòng text được lưu vào buffer dưới dạng một xâu kí tự, vậy làm thế nào để duyệt tuần tự xâu đó từ đầu đến cuối (trong ví dụ trên thì em muốn lọc ra riêng phần "Nguyễn Văn A" --> tìm ra kí tự ":" và sau đó làm thế nào để copy phần text sau dấu ":" cho đến khi gặp 2 dấu cách liền nhau thì dừng!)
    cái này bạn dùng hàm
    PHP Code:
    strtok(str,100,":"); 
    , nó sẽ đọc chuỗi str từ đầu đến dấu :

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    scanf(), fgets()... là C style, performance là rất kém so với ifstream và ofstream bên C++, lý do C++ sử dụng tốt hơn là vì nó có cả template cho class I/O, vì vậy các xử lý trên file trong C++ đều rất mạnh mẽ.
    Đoạn code trên cậu đọc không hiểu dòng nào thì ghi ra tui sẽ giải thích. Còn câu này :
    Em đã tìm trong các sách về C và C++ nhưng không thấy các hàm mà mình cần, Các bác có thể chỉ giúp em một số hàm sau được không ạ!
    Tui cảm giác nó không đáng tin cho lắm. Đây là những hàm rất cơ bản trong C++, có thể cậu nhầm sang sách C. Chú ý là C và C++ cú pháp thì giống như bản chất là rất khác nhau. C có cái C++ không có được và ngược lại. Nhưng đa phần C++ vượt trội hơn C về nhiều mặt, tuy vậy nếu tác động đến system thì C vượt trội hơn rất nhiều.
    Cậu nói không rõ ràng 1 tí nào, đưa lại ví dụ rõ ràng 1 tí.
    Nếu đọc 1 dòng thì đọc bằng cách này :
    C++ Code:
    1. #include <iostream>
    2. #include <fstream>
    3. #include <string>
    4.  
    5. int main(){
    6.   std::string a_line;
    7.   std::ifstream input_file;
    8.   input_file.open("abc.txt");
    9.   while(std::getline(input_file, a_line, ':')){
    10.     std::cout << a_line << "\n";
    11.   }
    12. }

    File abc.txt
    Code:
    Nguyen Van A : ABC
    Nguyen Van B : BCA
    Nếu đọc giả sử muốn vừa số vừa chữ, phân đoạn bởi 1 cái gì đó thì làm như sau :
    C++ Code:
    1. #include <iostream>
    2. #include <fstream>
    3. #include <string>
    4. #include <sstream>
    5.  
    6. int main(){
    7.   std::ifstream in_file("abc.txt");
    8.   std::string a_line;
    9.   while(std::getline(in_file, a_line)){
    10.     std::istringstream iss(a_line);
    11.     std::string delim;
    12.     iss >> delim;
    13.     if(delim == "OOO")
    14.       continue;
    15.  
    16.     int some_data;
    17.     iss >> some_data;
    18.     std::cout << some_data << '\n';
    19.   }
    20. }

    abc.txt
    Code:
    000 12
    000 23

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

  1. Cách ghi file .text trên visual c++?
    Gửi bởi linhkool trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 29-11-2011, 05:11 PM
  2. Lập trình C cần chỉ giáo về ghi file text trên ngôn ngữ c
    Gửi bởi pengok trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 07-10-2011, 05:45 PM
  3. Lưu dữ liệu trên dataGridview vào file text
    Gửi bởi Kun.|.Hidro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 10-11-2010, 11:44 PM
  4. Đọc chuỗi trên file text rồi lưu vào mảng như thế nào?
    Gửi bởi soul_knightvn trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 21-10-2010, 08:17 PM
  5. Tìm kiếm trên file! Tìm kiếm xâu mẫu dùng giải thuật Naive | Giúp mình code sai ở đâu
    Gửi bởi totoise trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 19-04-2009, 08:22 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