После использования fopen, чтобы открыть текстовый файл в C, он имеет дополнительные символы - PullRequest
0 голосов
/ 16 января 2012

Мне нужно прочитать в таблице данных в формате x*[tab]*y*[tab]*z*[tab]\n*, поэтому я использую fopen и fgetc для потоковой передачи символов.Цикл заканчивается, когда c==EOF.(c является символом.) Но у меня были трудности с этим, так как он переполняет мой массив.После некоторой отладки я понял, что открытый файл после последней строки содержит:

Northampton Oxford 68 ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ [...] ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý «« «« «« «« îþîþ

Что это?И почему это не появляется в моем текстовом файле?И как мне преодолеть эту проблему?

destination = fopen("ukcities.txt", "rt"); // r = read, t=text 

if (destination != NULL) {
    do {
       c = fgetc (destination);
              if (c == '    ') {
                temp_input[i][n] = '\0';
                i++;
                n=0;
              } else if (c == '\n') {
                  temp_input[i][n] = '\0';
                  printf("%s %s %s \n", temp_input[0], temp_input[1], temp_input[2]);
                  i = 0;
                  n=0;
              } else {
                  temp_input[i][n] = c;
                  n++;
              }
        } while (c != -1);  

    return 1;
} else {
    return 0;       
}

Ответы [ 2 ]

2 голосов
/ 16 января 2012

Глядя в мой хрустальный шар, я вижу, что fread или что бы вы ни использовали (очевидно, это fgetc, что делает его еще более правдоподобным), не завершает данные, которые он читает, и вы пытаетесь распечатать его как C-строку. Завершите данные символом NUL (a 0), и тогда они будут напечатаны правильно.

0 голосов
/ 16 января 2012

Эта строка выглядит неопределенной.В C строки, которые не заканчиваются символом '\0' (он же нулевой символ), приводят к постоянным проблемам, потому что многие стандартные библиотеки и системные библиотеки ожидают, что строки заканчиваются нулем.

Убедитесь, чточто, когда вы закончили читать все данные, строка завершается;в некоторых случаях это должно быть сделано вручную.Есть несколько способов сделать это (ниже все символы строки становятся нулевыми, поэтому, пока вы не перезапишите самый последний, строка всегда будет заканчиваться нулем):

// (1) declare an array of char, set all characters to null character
char buffer[1000] = {0};

В качестве альтернативы, если вы отслеживаете, где находитесь в буфере, вы также можете сделать это:

// (2) after reading in all data, add the null character yourself:
int n; // number of bytes read
char buf[1000];

// read data into buf, updating n

buf[n] = '\0'; // (tip: may need to use buf[n+1])

В любом случае важно, чтобы вы не переступали через конец буфера.Если вы выделили только 1000 байт, используйте только 999 байт и сохраните 1 байт для нулевого символа.

...