2015-08-23 3 views
2

У меня есть фрагмент кода, где я хочу читать столбчатые данные из txt-файла. Однако всякий раз, когда я это делаю, к началу файла добавляется большое число - а именно - -1.073742e + 008. Я не знаю, откуда это происходит, или как избавиться от него. Поскольку этот фрагмент является частью более крупной программы, предназначенной для автоматического чтения файла и передачи его в другое приложение, ручное удаление не является вариантом. Мой код, как он сейчас стоит, выглядит следующим образом.Большое число в начале данных, считанных из файла в C

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

void main() 
{ 
    FILE * fout; 
    int n; 
    float f1; 
    float f2; 
    float f3; 
    float npx[5208]; 
    float npy[5208]; 
    float npz[5208]; 
    int v1; 
    int i; 
/*read node cordinates fron the file */ 
    /*char buffer[100];*/ 
    fout = fopen("z1_115k.out", "r"); 
    /*fgets(buffer,100,fout);*/ /* skip the first line*/ 
    while(feof(fout)==0) 
    { 
     fscanf(fout, "%d %e %e %e\n", &v1, &f1, &f2, &f3); 
     npx[v1]=f1; 
     npy[v1]=f2; 
     npz[v1]=f3; 
    } 
    fclose(fout); 
    fout = fopen("writeout9.txt" , "w"); 
    for(i=0;i<5208;i++) 
    { 
     fprintf(fout, "%e",npy[i]); 
     fprintf(fout, "\n"); 
    } 
    fclose(fout); 
    getch(); 
} 

Файл я пытаюсь прочитать выглядит как этот

  1 -1.998999214E-04 -6.326398761E-06 7.987323916E-04 
     2 -1.993482729E-04 1.613270797E-05 8.020100649E-04 
     3 -1.998304651E-04 8.233274457E-06 7.735857507E-04 
     4 -9.247181879E-05 1.772655523E-04 6.779084215E-04 
     5 -7.928538980E-05 1.833699498E-04 6.915458362E-04 
     6 -9.789415344E-05 1.918512862E-04 6.868232158E-04 
     7 -1.943270909E-04 -4.729676220E-05 8.172317175E-04 
     8 -1.892633736E-04 -6.464808394E-05 8.175745024E-04 

И выход я получаю в первом столбце следующие

-1.073742e+008 
-1.998999e-004 
-1.993483e-004 
-1.998305e-004 
-9.247182e-005 
-7.928539e-005 
-9.789415e-005 
-1.943271e-004 
-1.892634e-004 

Почему я получение - 1.073e + 08 значение в начале?

ответ

0

Реальная проблема, скорее всего: Вы сохраняете значения для ваших массивов из из индекса 1, но печать из индекса 0. Поскольку массивы не инициализируются, вы получаете все, что хранится в ячейках хранилища. Вы можете либо вычесть 1 из прочитанного индекса (рекомендуется, но читать сначала). Или вы печатаете значения из индекса 1. Не рекомендуется, поскольку вы были первой записью массивов, и это поведение является несогласованностью на C и всех других языках с 0 в качестве первого индекса.

Но есть много других проблем с вашим кодом:

  1. Подпись main не является compliant стандарту. Это вызывает неопределенное поведение по возвращении. На самом деле ваш компилятор должен предупредить.
  2. feof только проверяет, установлен ли индикатор конца файла из предыдущей функции. Это не проверьте, находится ли файл в самом конце!
  3. Всегда проверять результаты функций, которые могут возвращать состояние ошибки. fopen - такая функция, scanf другой! Не тестирование может вызвать неопределенное поведение.
  4. Проверьте индекс массива v1 перед использованием! Это из-за ненадежного источника (даже больше, поскольку вы не проверяете результат fscanf), и любой доступ за пределами доступа будет вызывать неопределенное поведение.
  5. (более комментарий, чем вопрос) getch нестандартен.

Всегда включайте предупреждения компилятора и обращайте на них внимание!

Примечание: во время тестирования рекомендуется немедленно распечатать значения, считанные в контуре считывания в контуре считывания.

5

Вы записываете в массивы, используя индекс, указанный в крайнем левом столбце в файле. Поскольку это начинается с 1 в первой строке файла, запись № 0 останется неинициализированной. Это приводит к вывозу мусора, который вы видите при печати npy[0].

Также, не связанный с этой проблемой, вы должны прочитать Why is “while (!feof (file))” always wrong? Это может привести к ошибкам в конце файла и неправильной обработке файла с плохим файлом. Ваш цикл должен выглядеть следующим образом:

while (fscanf(fout, "%d %e %e %e\n", &v1, &f1, &f2, &f3) == 4) ... 

И, наконец, вы, вероятно, также хотят, чтобы проверить, что индекс массива находится в диапазоне перед записью на него.

0

Ваш файл начинается с номера 1, поэтому вы получаете доступ к npx[1]. Ваш цикл печати начинается с 0 и обращается к npx[0], который не имеет значения.

-1

Первый столбец - это индекс массива, что означает, что он начнется с нуля, а не один.

Вы можете изменить к

while(feof(fout)==0) 
{ 
    fscanf(fout, "%d %e %e %e\n", &v1, &f1, &f2, &f3); 
    npx[v1-1]=f1; 
    npy[v1-1]=f2; 
    npz[v1-1]=f3; 
} 
+0

Когда 'fscanf (()' возвращает EOF, значения в 'v1' и т. Д. Не заданы. Важно, чтобы возвращаемые значения были проверены перед использованием значений. – chux

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