Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,如何读取一个文件,并只存储双精度-忽略之前的文本?_C_File Io_Scanf - Fatal编程技术网

在C语言中,如何读取一个文件,并只存储双精度-忽略之前的文本?

在C语言中,如何读取一个文件,并只存储双精度-忽略之前的文本?,c,file-io,scanf,C,File Io,Scanf,我需要读入一个包含文本的文件,然后用一个double来表示该文本。这只是为了得到一组数字的平均值和标准差,所以前面的文本是不相关的。例如,我的输入文件看起来有点像: preface 7.0000 chapter_1 9.0000 chapter_2 12.0000 chapter_3 10.0000 等等 在这种情况下,它是为一本书的章节找到平均值和标准偏差。我有下面的代码部分,但我不太确定如何“忽略”文本,只抓取双倍。此时,这段代码输出零,并且只有当它超过数组限制时才退出循环,我在程序开始时

我需要读入一个包含文本的文件,然后用一个double来表示该文本。这只是为了得到一组数字的平均值和标准差,所以前面的文本是不相关的。例如,我的输入文件看起来有点像:

preface 7.0000
chapter_1 9.0000
chapter_2 12.0000
chapter_3 10.0000
等等

在这种情况下,它是为一本书的章节找到平均值和标准偏差。我有下面的代码部分,但我不太确定如何“忽略”文本,只抓取双倍。此时,这段代码输出零,并且只有当它超过数组限制时才退出循环,我在程序开始时将数组限制设置为常量20

FILE *ifp;
char *mode = "r";
ifp = fopen("table.txt", mode); 

double values[array_limit];
int i;
double sample;

if (ifp==NULL)
{
  printf("cannot read file \n");
}

else
{
i = 0;

do
{
   fscanf(ifp, "%lf", &sample);  

   if (!feof(ifp))
   {
      values[i] = sample;
      printf("%.4lf \n", values[i]);
      i++;
      if (i>=array_limit)   //prevents program from trying read past array size limit//
        {
           printf("No more space\n");
           break;
        }
   }

   else
   {
              printf("read complete\n");
              printf("lines = %d\n", i);
   }

  }while (!feof(ifp));
  fclose(ifp);
}

我认为您可以使用
fscanf(ifp,%*[^]%lf“,&sample)
来读取您的文件。
*
表示忽略该特定匹配,
[]
指定要匹配的字符列表,
^
指示匹配除
[]
中的字符以外的所有字符


或者可能(更简单一点)
fscanf(ifp,%*s%lf,&sample)
我认为您可以使用
fscanf(ifp,%*[^]%lf,&sample)
从文件中读取。
*
表示忽略该特定匹配,
[]
指定要匹配的字符列表,
^
指示匹配除
[]
中的字符以外的所有字符


或者可能(更简单一点)
fscanf(ifp,“%*s%lf”,&sample)
从文件读入时,通常最好使用
fgets
一次读取一行,然后提取您感兴趣的部分
sscanf

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

#define ARRAY_LIMIT 10
#define LINE_LENGTH 128

int main()
{
    double values[ARRAY_LIMIT];
    int i, count = 0;
    double sample;

    FILE *ifp = fopen("table.txt", "r");
    if (ifp==NULL)
    {
        printf("cannot read file \n");
        return 1;
    }

    char buff[LINE_LENGTH];
    while (fgets(buff, LINE_LENGTH, ifp) != NULL) 
    {
        if (sscanf(buff, "%*s %lf", &sample) != 1) break;
        values[count++] = sample;
        if (count == ARRAY_LIMIT) {
            printf("No more space\n");
            break;
        }
    }    
    fclose(ifp);

    for (i = 0; i < count; ++i) {
        printf("%d: %f\n", i, values[i]);
    }

    return 0;
}
#包括
#包括
#定义数组_限制10
#定义行长度128
int main()
{
双值[数组_限制];
int i,计数=0;
双样本;
文件*ifp=fopen(“table.txt”、“r”);
如果(ifp==NULL)
{
printf(“无法读取文件\n”);
返回1;
}
字符buff[行长度];
while(fgets(buff,LINE_LENGTH,ifp)!=NULL)
{
如果(sscanf(buff,%*s%lf,&样本)!=1)中断;
值[计数++]=样本;
if(计数==数组\u限制){
printf(“没有更多空间”);
打破
}
}    
fclose(ifp);
对于(i=0;i
fgets
如果遇到文件结尾或发生读取错误,则返回
NULL
。否则,它会将文件的一行读入字符缓冲区
buff

sscanf
中的星号
%*s
表示丢弃该行的第一部分。第二部分写入变量
sample
。我正在检查
sscanf
的返回值,它指示有多少个值已成功读取


循环在到达文件末尾或计数达到数组大小时中断。

从文件读入时,通常最好使用
fgets
一次读取一行,然后使用
sscanf
提取感兴趣的部分:

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

#define ARRAY_LIMIT 10
#define LINE_LENGTH 128

int main()
{
    double values[ARRAY_LIMIT];
    int i, count = 0;
    double sample;

    FILE *ifp = fopen("table.txt", "r");
    if (ifp==NULL)
    {
        printf("cannot read file \n");
        return 1;
    }

    char buff[LINE_LENGTH];
    while (fgets(buff, LINE_LENGTH, ifp) != NULL) 
    {
        if (sscanf(buff, "%*s %lf", &sample) != 1) break;
        values[count++] = sample;
        if (count == ARRAY_LIMIT) {
            printf("No more space\n");
            break;
        }
    }    
    fclose(ifp);

    for (i = 0; i < count; ++i) {
        printf("%d: %f\n", i, values[i]);
    }

    return 0;
}
#包括
#包括
#定义数组_限制10
#定义行长度128
int main()
{
双值[数组_限制];
int i,计数=0;
双样本;
文件*ifp=fopen(“table.txt”、“r”);
如果(ifp==NULL)
{
printf(“无法读取文件\n”);
返回1;
}
字符buff[行长度];
while(fgets(buff,LINE_LENGTH,ifp)!=NULL)
{
如果(sscanf(buff,%*s%lf,&样本)!=1)中断;
值[计数++]=样本;
if(计数==数组\u限制){
printf(“没有更多空间”);
打破
}
}    
fclose(ifp);
对于(i=0;i
fgets
如果遇到文件结尾或发生读取错误,则返回
NULL
。否则,它会将文件的一行读入字符缓冲区
buff

sscanf
中的星号
%*s
表示丢弃该行的第一部分。第二部分写入变量
sample
。我正在检查
sscanf
的返回值,它指示有多少个值已成功读取


循环在到达文件结尾或计数达到数组大小时中断。

您有两个主要问题——您使用的是feof,而不是检查
fscanf
的返回值,它告诉您是否得到了值(或是否得到了eof)

所以你想要的是

while ((found = fscanf(ifp, "%lf", &values[i])) != EOF) {  /* loop until eof */
    if (found) {
        /* got a value, so count it */
        if (++i >= ARRAY_LIMIT) {
            printf("no more space\n");
            break;
        }
    } else {
        /* something other than a value on input, so skip over it */
        fscanf(ifp, "%*c%*[^-+.0-9]");
    }
}

您有两个主要问题—您使用的是feof,而您没有检查
fscanf
的返回值,它告诉您是否得到了值(或者是否得到了eof)

所以你想要的是

while ((found = fscanf(ifp, "%lf", &values[i])) != EOF) {  /* loop until eof */
    if (found) {
        /* got a value, so count it */
        if (++i >= ARRAY_LIMIT) {
            printf("no more space\n");
            break;
        }
    } else {
        /* something other than a value on input, so skip over it */
        fscanf(ifp, "%*c%*[^-+.0-9]");
    }
}

非常感谢,我知道有一种方法可以忽略所有字符,但我不知道你可以只使用[^]非常感谢,我知道有一种方法可以忽略所有字符,但我不知道你可以只使用[^]