#c #parsing #file
#c #Синтаксический анализ #файл
Вопрос:
У меня есть следующее в текстовом файле под названием: values.txt
1 4
2.5 3.76
122 10
277.543
165.4432
Я пытаюсь прочитать содержимое этого текстового файла, сложить каждую из двух пар вместе и вывести результат…
результат будет примерно таким :
1 Pair:(1, 4) = 5
2 Pair:(2.5, 3.76)= 6.26
и так далее ..
Я открываю файл следующим образом
int c;
FILE myfile;
myfile= fopen("values.txt", "r");
if ( myfile == NULL ) {
printf("Cannot open TEXT filen");
return 1;
}
double aa,bb;
while ( (c = getc(myfile) ) != EOF ) {
// HERE SHOULD I DO THE OUTPUT BUT HOW?
}
Любая помощь действительно ценится..
Язык = C
Комментарии:
1. Зачем использовать
return 1;
вместоreturn 0;
?
Ответ №1:
Следующий код выполняет то, что вы ожидаете. myfile должен быть объявлен как FILE *. fopen возвращает указатель на файловую структуру. Если файл очень большой, я бы рекомендовал читать в буферах большого размера (например: 65535 и т.д.) И разбирать его по символам и преобразовывать в значения с плавающей запятой. Это уменьшает накладные расходы на системный вызов, которые занимают больше времени, чем обработка текста для преобразования в значения с плавающей точкой.
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{
FILE* myfile;
myfile = fopen("values.txt", "r");
if ( myfile == NULL ) {
printf("Cannot open TEXT filen");
return 1;
}
double aa,bb;
while (2 == fscanf(myfile, "%lf %lf", amp;aa, amp;bb)) {
printf("%lfn", aa bb);
}
return 0;
}
Комментарии:
1. спасибо за ответ .. я знаю, как это сделать на c с помощью правого сдвига >> но я не знал, как это сделать на c, еще раз спасибо
Ответ №2:
Для выполнения этой простой задачи используйте
удваивает a, b; if (fscanf(myfile, "%lf %lf", amp;a, amp;b) == 2) printf("%f %f = %f n", a, b, a b);
.
Ответ №3:
похоже на домашнюю задачу, но fscanf
можно преобразовать строку в переменную типа:
int n;
fscanf (myfile,"%d",amp;n);
Комментарии:
1. нет, это не домашнее задание… я пытаюсь вычислить разницу во времени между кадрами, которые я извлекаю из фильма…
2. Поскольку некоторые числа кажутся дробными,
%d
формат иint
тип, вероятно, не соответствуют друг другу наилучшим образом.
Ответ №4:
Вы не показали, что вам нужно в качестве выходных данных для строк с одним значением, но это похоже на случай fgets()
и sscanf()
, если вы действительно не хотите, чтобы две строки с одним значением обрабатывались как единое целое.
char buffer[256];
int rownum = 0;
while (fgets(buffer, sizeof(buffer), myfile) != 0)
{
double aa, bb;
int n = sscanf(buffer, "%lf %lf", amp;aa, amp;bb);
if (n == 2)
printf("%d Pair:(%g, %g) = %gn", rownum, aa, bb, aa bb);
else if (n == 1)
printf("%d Solo:(%g) = %gn", rownum, aa, aa);
else
{
printf("Failed to find any numbers in <<%s>>n", buffer);
}
}
Если вы использовали fscanf(myfile, "%g %g", amp;aa, amp;bb)
, то он читал бы через новые строки (они считаются пробелами) в поисках чисел, поэтому он считывал бы одно число из одной строки, а второе — из другой строки. Обычно это не то, что нужно людям (но когда это то, что вам нужно, это чрезвычайно полезно). Восстановление ошибок с помощью fscanf()
имеет тенденцию быть более сложным, чем с помощью fgets()
и sscanf()
.
Ответ №5:
это на c извините: (я не знаю c
это очень простой логический код для простого мышления: D я тоже новичок, я не тестировал эту программу, поэтому извините, если что-то пойдет не так, но точно по тому же принципу работал мой синтаксический анализатор, и он работал нормально. так что это верный метод. не очень эффективно, но … не используйте эту программу сразу, поймите ее логику, это вам очень поможет. копирование этого ничего вам не даст…Преподаватели синтаксического анализа встречаются так редко….
int x= 0; char ch = ‘r’; //я использовал это уравнение, чтобы избежать ошибки при первой проверке ch. при запуске программы оно должно быть чем-то заполнено. char bigch[10]; int checknumber = 0;
первое число с плавающей запятой = 0; второе число с плавающей запятой = 0; результат с плавающей запятой =0;
void clearar(char from bigar[10], int xar) //эта функция получает bigch в качестве ссылки, что означает, что все изменения, внесенные здесь, напрямую повлияют на сам bigch. эта функция получает фактическую длину массива и помещает пробелы в каждый элемент bigch, чтобы обнулить числа. нам нужно очистить bigch от любых предыдущих чисел. ниже вы увидите, зачем мне это было нужно. ‘xar’ — это x из основной функции. это здесь для того, чтобы сообщить нашему очистителю истинную длину заполненных элементов bigar. { for (int i=0; i }
}
int main() { <——————- // здесь вы добавляете команды открытия и чтения файла while(!myfile.eof()) //пока не достигнут конец текстового файла { ch=myfile.get(); //переводит каждую букву в ch и переводит курсор на один шаг вперед в текстовом файле для дальнейшего чтения. get() автоматически перенаправляет курсор
if (ch!= " ") //i used space as an indicator where one number ends
//so while space havent been reahced, read letters.
{ bigch[x] = ch; //get read letter into bigch array.
x ; //icrement bigch array step
}
else
if(ch == " ") //if space is reached that means one number has ended and
{ im trying to set a flag at that moment. it will be used further.
checknumber ; the flag is simple number. first space will set checknumber to 1
second space will set it to 2. thats all.
}
if (checknumber == 1) //if our checknumber is 1, wich means that reading
of first number is done, lets make one whole float
from that bigch array.
{ firstnumber = atof(bigch); //здесь мы получаем bigch, команда atof (array to float) преобразует
массив bigch в одно целое число с плавающей точкой.
clearar(bigch,x); //here we send bigch and its element step into function where
bigch gets cleaned because we dont want some ghost numbers in it.
abviously clearar function cleans bigch int main function aswell,
not only in it's teritory. its a global cleaning :)
}
else if (checknumber ==2) //here we do the same but if flag is 2 this means that two spaces
had been passed and its time to convert bigch into secondnumber.
{ secondnumber = atof(bigch); //same method of converting array into float (it hates other
not number letters, i mean if its a number its fine. if in your text
was 'a' or 's' in that case atof will panic hehe.. )
clearar(bigch,x); //same thing, we send bigch to cleaner function to kill any numbers
it, we get one space letter ( " " ) into each element of bigch.
}
контрольный номер = 0; если оба числа были считаны и преобразованы. нам нужно выполнить сброс
флажок пробела. и начинаем считать с 0; для следующей пары чисел.
результат = firstnumber secondnumber; ну тут все понятно. } }