2014-10-21 5 views
0

У меня есть код ниже, и я пытаюсь прочитать текстовый файл с разделителями-запятыми и нужно захватить значения. Текстовый файл (out.txt) содержит 2 числа:Чтение значений текстового файла

12.4,45.8 

Мой код:

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

int main() 
{ 
    system("python Grab_Values.py > out.txt"); 

    FILE *ptr_file; 
    char buf[1000]; 
    int v1; 
    int v2; 

    ptr_file =fopen("out.txt","r"); 
    if (!ptr_file) 
      return 1; 
    while (fgets(buf,1000, ptr_file)!=NULL) 
      fscanf(buf, "%d,%d\n", &v1, &v2); 

    fclose(ptr_file); 
    printf("%d" "\n", v1); 
    return 0; 
} 

При компиляции я получаю следующие ошибки:

test.c: In function âmainâ: 
test.c:17:10: warning: passing argument 1 of âfscanfâ from incompatible pointer type [enabled by default] 
/usr/include/stdio.h:445:12: note: expected âstruct FILE * __restrict__â but argument is of type âchar *â 

Я до сих пор переменного тока noob, поэтому, вероятно, это простая ошибка, но я не могу понять, что :(

+1

'int fscanf (FILE * stream, const char * format, ...);' Также неверно использовать '% d' для чтения значения float (12.4). –

+0

определение fscanf: 'int fscanf (FILE * stream, const char * format, ...);' – bitcell

+1

Вы, кажется, читаете целые числа ("% d,% d"), но значения, которые вы показываете, являются плавающей запятой значения. – Evert

ответ

0

Три вещи не соответствуют этому:

while (fgets(buf,1000, ptr_file)!=NULL) 
     fscanf(buf, "%d,%d\n", &v1, &v2); 
  1. fgets уже читает данные, так что это не более доступны для fscanf
  2. использовать %d в качестве спецификатора формата (целое число), но вы хотите, чтобы считывать значения с плавающей точкой (также изменить тип v1 и v2!)
  3. Первый аргумент fscanf - это поток файлов, поэтому вам необходимо предоставить ptr_file.

Так измените его на:

fscanf(ptr_file, "%f,%f", &v1, &v2); 

Но также отметить, что этот формат текст не может работать с другими местами, где запятой является десятичной точкой! Вы должны рассмотреть возможность включения значений поплавка, разделенных запятыми, кавычками.

+0

Спасибо, что указал мне в правильном направлении. Похоже, теперь и дальше. :) – Greg

0

Вы используете 'fscanf', который используется для читать из файла. Я думаю, вы хотите использовать «sscanf» для чтения ввода из массива символов «buf», в который вы читали содержимое файла.

Бонусные баллы - вы могли бы просто использовать fscanf и покончить с «fgets».

0

Ошибка в коде здесь,

fscanf(buf, "%d,%d\n", &v1, &v2); 

fscanf() ожидает FILE* или более явно stream но вы даете указатель на символ ..

Вы можете использовать sscanf() вместо этого, если вы хотите прочитать с символьного указателя

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