2013-08-06 3 views
0

Я пытаюсь заполнить массив из текстового файла. Я использую fgetc, и моя проблема связана с символами новой строки, которые находятся в текстовом файле. В настоящее время я получил,C заполнение массива из текстового файла

for(i = 0; i < rows; i++){ 
    for(j = 0; j < columns; j++){ 
     if((fgetc(fp) == '\n') || (fgetc(fp) == '\r')){ 
      fgetc(fp); 
      array[i][j] = fgetc(fp);  
     else{ 
      array[i][j] = fgetc(fp); 
     } 
     printf("i %d j %d char %c code %d\n", i, j, array[i][j], array[i][j]); 
    } 
} 

Идея заключается в том, что если есть символ новой строки, я хочу, чтобы продвинуть указатель файла в то время как в том же I, J положение петли, так что я могу получить следующий символ. Результат для этого смешался для первых двух строк, а затем он начинает читать символы с символьным кодом -1. Я делаю что-то ужасно неправильно?

+0

Вы хотите сохранить строки в файле? –

ответ

1

Каждый вызов fgetc будет продвигать указатель файла. Попробуйте позвонить один раз:

int c = fgetc (fp);

затем проверьте значение c. Сохраните его, если хотите, или повторите цикл.

+0

спасибо! Я исправил это просто, заменив большинство вызовов fgetc (fp) на вызовы 'c', я вызывал fgetc слишком много раз. – user2655377

1

В вашем первом заявлении if() есть немного проблемы. Когда вы сделаете это:

if((fgetc(fp) == '\n') || (fgetc(fp) == '\r')){ 
     fgetc(fp); 
     array[i][j] = fgetc(fp); 

Вы фактически вызываете fgetc(fp) четыре раза. Дважды в операторе if(), дважды позже. Возможно, вы ищете более что-то вроде этого:

for(i = 0; i < rows; i++){ 
    for(j = 0; j < columns; j++){ 
     int test = fgetc(fp); 
     if(test != '\n' && test != '\r') 
      array[i][j] = test; 
     //We want to "undo" the last j++ if we got a whitespace 
     else 
      j--; 
     printf("i %d j %d char %c code %d\n", i, j, array[i][j], array[i][j]); 
    } 
} 

В этом примере, вы вызываете fgetc(fp) ровно один раз на одну итерацию, и если это не \ п или \ г, вы поместите его в массив.

Прошу прощения, у меня мало опыта работы с fgetc(). Если вы заметили что-то невероятно ужасное, что я сделал, сообщите мне об этом!

1

Я сразу вижу один источник ошибок. В следующей строке:

if((fgetc(fp) == '\n') || (fgetc(fp) == '\r')) 

Есть 2 вызова функции fgetc(). Это означает, что если первый вызов не возвращает '\ n', будет сделан другой вызов, возвращаемое значение которого сравнивается с '\ r'. Это приводит к удлинению указателя файла, поскольку указатель увеличивается каждый раз, когда вы вызываете fgetc. Лучший способ сделать это - получить один символ, а затем проверить, является ли он «\ n» или «\ r», и только затем увеличивать указатель на файл другим вызовом fgetc, если это правда. Например:

char letter = fgetc(fp); 
if((letter == '\n') || (letter == '\r') 
... 
... 

Попробуйте это и проверьте, не по-прежнему ли у вас такая же ошибка.

1

Я считаю, что вы получаете персонажа в своем оценочном заявлении дважды. Кроме того, как правило, строки символов CRLF (возврат каретки и строки) могут содержать два символа. Прочтите http://en.wikipedia.org/wiki/Newline для получения более подробной информации.

Это был быстрый удар по коду из памяти. У меня нет компилятора, который легко доступен, но я думаю, что это правильно.

Смежные вопросы