некоторые части текста, извлеченные из txt-файла с помощью fgets, потерялись в c - PullRequest
0 голосов
/ 24 марта 2019

Я читаю файл под названием "dictionary.txt" с помощью fgets и распечатываю, но, как и 10% текста заголовка из "dictionary.txt", теряется при запуске программы.

Я подозреваю, что размер буфера небольшой, но изменение MAX_INT на большее число тоже не поможет.

#include <stdio.h>
#include<string.h>
#define MAX_INT 50000

void main() {
    FILE *fp;
    char* inp = (char*)malloc(sizeof(char)*MAX_INT);
    int i;
    int isKorean = 0;
    char* buffer[MAX_INT];
    char* ptr = (char*)malloc(sizeof(char)*MAX_INT);

    if (fp = fopen("C://Users//user//Desktop//dictionary.txt", "r")) {
        while (fgets(buffer, sizeof(buffer), fp)) {
            ptr = strtok(buffer, "/"); //a line is looking like this : Umberto/영어("English" written in Korean)
            for (i = 0; i < strlen(ptr); i++) {
                if ((ptr[i] & 0x80) == 0x80) isKorean = 1; //check whether it's korean
                if (!isKorean) printf("%c", ptr[i]); //if it's not korean, then print one byte
                else {
                    printf("%c%c", ptr[i], ptr[i + 1]); //if it's korean, then print two bytes
                    i++;
                }
                isKorean = 0;
                printf("\n");
            }
            ptr = strtok(NULL, " ");
            printf("tagger:%s\n", ptr); //print the POS tagger of the word(it's in dictionary)
        }

        fclose(fp);
    }
}

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Функция fgets имеет следующее описание:

char *
 fgets(char * restrict str, int size, FILE * restrict stream);

Так зачем делать буфер массивом указателей? char buffer[MAX_INT] это то, что нам нужно.
И следующее утверждение: if (fp = fopen("/Users/weiyang/code/txt", "r")) небезопасно, лучше добавить скобки после присваивания.

0 голосов
/ 24 марта 2019

Хорошо, я нашел ответ.

Добавляя ниже после "ptr = strtok (NULL," ");" просто работал. Я также должен был что-то сделать с частью tagger, потому что она также написана на корейском языке.

ptr = strtok(NULL, " ");
			for (i = 0; i < strlen(ptr); i++) {
				printf("%c%c", ptr[i], ptr[i + 1]); //if it's korean, then print two bytes
				i++;
			}
...