PDA

View Full Version : Đếm tổng số đoạn văn từ file .txt. Chương trình build không có lỗi nhưng lại không đếm được!



ngocnghech
19-04-2012, 06:53 PM
Cả nhà ơi giúp em vấn đề này với ạ!

Đề bài: Cho văn bản có cấu trúc như sau:
- Đoạn đầu tiên chỉ chứa một câu là tiêu đề của văn bản (có thể không có dấu kết thúc câu), ngăn cách với đoạn tiếp theo bởi ít nhất 1 kí tự xuống dòng.
- Các đoạn tiếp theo mỗi đoạn chứa ít nhất 1 câu. Các đoạn được ngăn cách nhau bởi ít nhất 1 kí tự xuống dòng.

Yêu cầu:: Đếm tổng số đoạn văn, không tính tiêu đề

Ý tưởng của em là: đọc từng dòng, đếm tổng số kí tự \n.
Đây là đoạn code của em, nhưng không hiểu sao lại trả về countP = 0. (:-)??
Mong mọi người giúp đỡ! Em sắp phải nộp bài rồi mà vẫn chưa nghĩ ra được!
Cảm ơn cả nhà!


int countPar(char m[100][100], int &dem)
{
FILE* fin1 = fopen("e:\\VanBanDeMo.txt", "rt");
dem = 0;
int countP = 0;
char s[MAXCHARS];

if(fin1 == NULL)
{
printf ("loi mo file\n");
}
else
{
while(fgets(s, MAXCHARS, fin1) != NULL)
{
strcpy(m[dem], s);

if (m[dem] == "\n")
{
countP++;
}
dem++;
}
}

return countP;
fclose(fin1);
}

doicanhden
20-04-2012, 12:08 AM
/*
Code lai căng C và C++. :-|
Truyền giá trị vào không biết để làm gì.
Không post đầy đủ code.
*/
//int countPar(char m[100][100], int &dem)
int countPar()
{
FILE* fin1 = fopen("e:\\VanBanDeMo.txt", "rt");
// dem = 0;
int countP = 0;
char s[MAXCHARS];

if(fin1 == NULL)
{
printf ("loi mo file\n");
}
else
{
//// Xem lại cái vòng while này.
//// Đọc vào một mảng các kí tự.
//while(fgets(s, MAXCHARS, fin1) != NULL)
//{
// // Copy lại làm gì thế hả???
// strcpy(m[dem], s);
//
// // Đếm '\n' kiểu này sao??
// if (m[dem] == "\n")
// {
// countP++;
// }
// dem++;
//}
/*
char * fgets ( char * str, int num, FILE * stream );
http://cplusplus.com/reference/clibrary/cstdio/fgets/

const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
http://cplusplus.com/reference/clibrary/cstring/strchr/

*/
while(NULL != fgets(s, MAXCHARS, fin1))
while (NULL != (s = strchr(s, '\n')))
countP++; // Số lượng kí tự '\n'
}

return countP;
::fclose(fin1);
}

ngocnghech
20-04-2012, 08:06 PM
Cảm ơn bác đã góp ý nha! (=D)>
Em ngẫm ra được nhiều điều hơn! Phải coi lại kiến thức thôi! hic):)T

Vâng! Em biết rồi ạ! Cảm ơn bác đã góp ý nhiệt tình! Tại em sợ post đủ code mọi người đọc sẽ mất thời gian! Em không biết là như bác nói! Nhưng mà bác ơi code của bác em về chạy thử không được! Nên em phải xài cái fgetc đọc từng kí tự! Mà nó lâu quá! Bác có cách nào hay hơn bày cho em được không ạ?
À mà còn mấy người vô văn hóa như vậy bác để ý làm gì cho mệt! Không biết tụi nó nghĩ gì nữa mà lại đặt cái username như vậy! Bó tay!(8-)>

doicanhden
21-04-2012, 05:44 PM
xin lỗi nhé, tại code ẩu, quên cái vụ s là constant. :p Bạn sửa lại như sau là ok. :D. À, quên nữa, trong code của bạn hàm ::fclose() nằm sao lệnh return, nó sẽ ko bao giờ được gọi, di chuyển lên trước nhé


#define MAXCHARS 256
int countPar()
{
char s[MAXCHARS];
int iRet = 0;
FILE *fin1 = fopen("e:\\VanBanDeMo.txt", "rt");
if(fin1 == NULL)
printf ("Loi mo file.\n");
else
{
/* char * fgets ( char * str, int num, FILE * stream );
http://cplusplus.com/reference/clibrary/cstdio/fgets/

const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
http://cplusplus.com/reference/clibrary/cstring/strchr/
*/

while(NULL != fgets(s, MAXCHARS, fin1))
{
char *pos = s;
while (NULL != (pos = strchr(pos, '\n')))
{
++iRet; // Số lượng kí tự '\n'
++pos; // Bỏ qua kí tự '\n'
}
}
::fclose(fin1); // Cho vào đây
}

return iRet;
}

homanhduc
26-04-2012, 10:22 PM
while(NULL != fgets(s, MAXCHARS, fin1))
{
char *pos = s;
while (NULL != (pos = strchr(pos, '\n')))
{
++iRet; // Số lượng kí tự '\n'
++pos; // Bỏ qua kí tự '\n'
}
}


Không có ý săm soi, chỉ đùa tí ^^:
http://i.umumble.com/img/topic-1321451499.jpg

doicanhden
27-04-2012, 10:01 AM
xăm xoi vụ 5 == count ấy hả???
gõ code an toàn đấy, nhỡ có gõ nhầm 5 = count thì trình biên dịch sẽ báo lỗi, nhắc nhở. Không thì debug đến tết.

homanhduc
28-04-2012, 08:28 AM
xăm xoi vụ 5 == count ấy hả???
gõ code an toàn đấy, nhỡ có gõ nhầm 5 = count thì trình biên dịch sẽ báo lỗi, nhắc nhở. Không thì debug đến tết.

^^. Ý tớ là cái cách viết giống cách nói chuyện của nhân vật Yoda kiểu như :"Begun, the Clone War has" ...... trên mạng họ gọi là Yoda code......
Hì hì, không chê bai j đâu.

doicanhden
01-05-2012, 01:29 AM
yoda code? Mới nghe đấy, search trên google thì cũng ra một vài thứ thú vị. :))
Lúc mới gõ code toàn bị gõ nhầm == thành = hoài, nên tự nghĩ ra cách sửa. Đọc code thì kì cục thật nhưng dùng riết rồi quen.
__http://united-coders.com/christian-harms/what-are-yoda-conditions