Tôi là người mới bắt đầu trong lập trình C và hệ thống. Đối với bài tập về nhà, tôi cần viết chương trình đọc đầu vào từ các dòng phân tích cú pháp stdin thành các từ và gửi các từ tới các tiến trình sắp xếp bằng cách sử dụng hàng đợi thông báo System V (ví dụ: đếm từ). Tôi bị kẹt ở phần đầu vào. Tôi đang cố gắng xử lý dữ liệu nhập, xóa các ký tự không phải alpha, đặt tất cả các từ alpha trong chữ thường và cuối cùng, chia một dòng từ thành nhiều từ. Cho đến nay tôi có thể in tất cả các từ alpha trong trường hợp thấp hơn, nhưng có những dòng giữa các từ, mà tôi tin là không chính xác. Ai đó có thể xem và đưa cho tôi một số gợi ý?Đọc từ một tệp văn bản và phân tích các dòng thành các từ trong C
Ví dụ từ một tập tin văn bản: Dự án Gutenberg EBook của The Iliad của Homer, bởi Homer
Tôi nghĩ rằng kết quả chính xác nên được:
the
project
gutenberg
ebook
of
the
iliad
of
homer
by
homer
Nhưng đầu ra của tôi là như sau:
project
gutenberg
ebook
of
the
iliad
of
homer
<------There is a line there
by
homer
Tôi nghĩ dòng trống là do khoảng cách giữa "," và "theo". Tôi đã thử những thứ như "nếu isspace (c) sau đó không làm gì", nhưng nó không hoạt động. Mã của tôi là dưới đây. Bất kỳ trợ giúp hoặc đề xuất nào được đánh giá cao.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
//Main Function
int main (int argc, char **argv)
{
int c;
char *input = argv[1];
FILE *input_file;
input_file = fopen(input, "r");
if (input_file == 0)
{
//fopen returns 0, the NULL pointer, on failure
perror("Canot open input file\n");
exit(-1);
}
else
{
while ((c =fgetc(input_file)) != EOF)
{
//if it's an alpha, convert it to lower case
if (isalpha(c))
{
c = tolower(c);
putchar(c);
}
else if (isspace(c))
{
; //do nothing
}
else
{
c = '\n';
putchar(c);
}
}
}
fclose(input_file);
printf("\n");
return 0;
}
EDIT **
tôi sửa mã của tôi và cuối cùng đã đầu ra chính xác:
int main (int argc, char **argv)
{
int c;
char *input = argv[1];
FILE *input_file;
input_file = fopen(input, "r");
if (input_file == 0)
{
//fopen returns 0, the NULL pointer, on failure
perror("Canot open input file\n");
exit(-1);
}
else
{
int found_word = 0;
while ((c =fgetc(input_file)) != EOF)
{
//if it's an alpha, convert it to lower case
if (isalpha(c))
{
found_word = 1;
c = tolower(c);
putchar(c);
}
else {
if (found_word) {
putchar('\n');
found_word=0;
}
}
}
}
fclose(input_file);
printf("\n");
return 0;
}
+1 để đăng mã hợp lý. Một gợi ý: 'perror (input)'. Có vài điều tồi tệ hơn thông báo lỗi mà không có tên tệp. –
chức năng strtok có thể hữu ích. – keety