Code C chạy được trên CodeBlock, visual studio nhưng không chạy được trên Linux

Anh em giúp mình với. Mình code bài này trên CodeBlock chạy ngon lành như bỏ sang compile bên Linux thì nó bị lỗi không đọc file được.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 7
int c = 0;
char band_diagnose[SIZE];
int read_doctor_list(char filename[], char type[], char band_names[][20], char band_diagnose[])
{
	char line[100];
	int i = 0, j = 0;
	FILE *fp = fopen(filename, type);
	if (!filename)
	{
		printf("Fail to open the file");
		return 0;
	}
	else
	{
		while (fgets(line, 100, fp))
		{
			if (c % 2 == 0)
			{
				strcpy(band_names[i], line);
				strtok(band_names[i], "\n");
				i++;
			}
			else
			{
				if (!strcmp(line, "Positive\n"))
				{
					band_diagnose[j] = 'P';
				}
				else if (!strcmpi(line, "Negative\n"))
				{
					band_diagnose[j] = 'N';
				}

				j++;
			}

			c++;

		}

		return 1;

	}

	fclose(fp);

}

void band_practice_list(char filename[], char status[], char band_names[][20], char band_diagnose[])
{
	int i = 0;
	FILE *fp = fopen(filename, "w");
	if (!filename)
	{
		printf("Fail to open the file!");
	}
	else
	{
		if (!strcmp(status, "Positive"))
		{
			char pos[] = "+Positive+";
			fprintf(fp, "---List of Positive Cases---\n");
			for (i = 0; i < SIZE; i++)
			{
				if (band_diagnose[i] == 'P')
				{
					fprintf(fp, "--%s:%s\n", band_names[i], pos);
				}
			}

			fclose(fp);
		}

		if (!strcmp(status, "Negative"))
		{
			rewind(fp);
			char neg[] = "-Neg-";
			fprintf(fp, "---List of Negative cases:---\n");

			for (i = 0; i < SIZE; i++)
			{
				if (band_diagnose[i] == 'N')
				{
					fprintf(fp, "--%s:%s\n", band_names[i], neg);
				}
			}

			fclose(fp);
		}

		printf("Creating list...\n");
		for (i = 0; i < SIZE; i++)
		{
			if (band_diagnose[i] == 'P')
			{
				printf("%s:%c...Can't go to practice!:(\n\n", band_names[i], band_diagnose[i]);
			}
			else
			{
				printf("%s:%c...Good to go to practice!:)\n\n", band_names[i], band_diagnose[i]);
			}
		}
	}
}

int main(int argc, char **argv)
{
	char band_names[SIZE][20];
	char band_diagnose[SIZE];

	int n = read_doctor_list("doctorlist.txt", "r", band_names, band_diagnose);

	if (n)
	{
		band_practice_list("output_p.txt", "Positive", band_names, band_diagnose);
		band_practice_list("output_n.txt", "Negative", band_names, band_diagnose);
	}
}

EDIT (@library): @Nham_Chanel Cậu nhớ sử dụng Markdown để format code từ các post sau nhé! :smile:

@library Mình mới tập tành code nên gà lắm, trước giờ không có nền tảng computer :frowning:

Cậu có thể google Markdown để biết thêm chi tiết, hoặc tham khảo bài viết này. Đó là một dạng ngôn ngữ đánh dấu thôi.
Tớ đã áp dụng Markdown cho comment đầu tiên của cậu rồi đó! :smile:


Nhân tiện, cậu có thể chụp lại kết quả trả về bên code block được không?

3 Likes

Đây là kết quả trả về nè cậu,
mình input cái doctorlist.txt này
this is the input file:
doctorlist.txt

Flea X
Positive
Anthony Kiedis
Positive
Chad Smith
Negative
John Frusciante
Negative
Jack Irons
Positive
Cliff Martinez
Positive
Arik Marshall
Negative

chạy hết chương trình thì nó output ra 2 file text trong hình.

1 Like

Vấn đề ở đây có thể do line-ending (EOL) ở file doctorlist.txt của bạn.

Bên Windows, thì EOL thường là \r\n, còn bên linux chỉ có \n, nên khi xử lý đọc từng dòng bên linux, \r sẽ còn nằm lại trên line, dẫn đến việc gọi các hàm strcmp bị sai.

Bạn thử dùng một trình soạn thảo tốt hơn bên windows như Notepad++, hoặc VSCode và change EOL về dạng linux trước khi copy sang máy linux.
Hoặc là strim/strip whitespaces các dòng đọc được từ file trước khi gọi các hàm strcmp thử xem.

5 Likes

Sửa lại thành so khớp phần đầu thôi.

2 Likes

Mình thử tạo file text bên linux rồi cho chạy program thì ổn bạn. Thì ra lỗi với cái file text mình copy bên windown sang.

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