Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_File Io - Fatal编程技术网

在C中从不同的文本文件创建一个值数组

在C中从不同的文本文件创建一个值数组,c,arrays,file-io,C,Arrays,File Io,我在64位Ubuntu 14.04上用C语言工作 我有许多.txt文件,每个文件都包含浮点值行(每行1个值)。这些线表示复杂样本的一部分,如果有意义的话,它们存储为real(a1)\n imag(a1)\n real(a2)\n imag(a2) 在一个特定的场景中,有4个文本文件,每个文件包含32768个样本(因此65536个值),但我需要使最终版本动态以容纳多达32个文件(但每个文件的最大样本数不会超过32768)。不过,我将只读取前19800个样本(取决于其他内容),因为整个信号都包含在这

我在64位Ubuntu 14.04上用C语言工作

我有许多.txt文件,每个文件都包含浮点值行(每行1个值)。这些线表示复杂样本的一部分,如果有意义的话,它们存储为real(a1)\n imag(a1)\n real(a2)\n imag(a2)

在一个特定的场景中,有4个文本文件,每个文件包含32768个样本(因此65536个值),但我需要使最终版本动态以容纳多达32个文件(但每个文件的最大样本数不会超过32768)。不过,我将只读取前19800个样本(取决于其他内容),因为整个信号都包含在这39600个点(19800个样本)中

一种常见的抽象是将文件/样本表示为矩阵,其中列表示返回信号,行表示采样瞬间每个信号的值,直到最大持续时间

我试图做的是从每个返回信号中获取第一个样本,并将其移动到双精度浮点值数组中进行处理,然后移动到每个信号的第二个样本(这将覆盖前一个数组)并对其进行处理,依此类推,直到处理完最后一行样本

是否有一种方法可以动态打开每个信号的文件(取决于我在该特定实例中使用的脉冲数),将每个文件中的第一个样本读取到缓冲区中,并将其发送以进行处理。在下一次迭代中,文件指针都将与第二个样本对齐,然后将它们移动到一个数组中并再次发送,直到达到所需的样本量(在我们假设的情况下为19800个)

我可以使用fscanf从文件中很好地读取样本:

rx_length = 19800;
int x;
float buf;

double *range_samples = calloc(num_pulses, 2 * sizeof(range_samples));

for (i=0; i < 2 * rx_length; i++){
    x = fscanf(pulse_file, "%f", &buf);
    *(range_samples) = buf;
}
rx_长度=19800;
int x;
浮球;
double*range\u samples=calloc(num\u脉冲,2*sizeof(range\u samples));
对于(i=0;i<2*rx_长度;i++){
x=fscanf(脉冲_文件、%f、&buf);
*(样本范围)=buf;
}
所有需要发生的事情(在我看来)是,我需要循环采样和脉冲(按照这个顺序),所以当完成一个脉冲时,它将继续下一个脉冲的下一组样本,以此类推。我不知道如何为所有返回信号文件声明文件指针,因为它们的数量在两次调用之间可能有所不同(例如,对4个脉冲执行整个操作,下一次调用可能是16或64)

如果有任何想法/意见/建议,我很乐意听取


谢谢。

我将使您发布的代码成为一个函数,该函数以文件名数组作为参数:

void doPulse( const char **file_names, const int size )
{
  FILE *file = 0;

  // declare your other variables

  for ( int i = 0; i < size; ++i )
  {
    file = fopen( file_names[i] );

    // make sure file is open
    // do the work on that file

    fclose( file );
    file = 0;
  }
}
void doPulse(常量字符**文件名,常量整数大小)
{
FILE*FILE=0;
//声明其他变量
对于(int i=0;i
您需要的是发电机。它在C++中是相当简单的,但是当你标记C时,我可以想象一个函数,它以一个自定义结构(对象的状态)作为参数。它可能类似于(伪代码):

然后,主程序可以包含:

GtorState state;
// initialize the list of files to process
gtorInit(&state, files);

double real, imag);
int cr;
while (0 == (cr = nextValue(&state, &real, &imag)) {
    // process (real, imag)
}
if (cr == 2) {
    // process (at least display) error
}

或者,您的主程序可以迭代不同文件的值,并使用上面处理值的生成器的状态模拟调用函数,最后使用处理函数的状态来获得结果。

尝试了一种稍微不同的方法,效果非常好

不是每次我想做某件事时都从不同的文件中读取内容,而是将每个文件的全部内容读取到一个2D数组范围\相位\数据[样本\编号][脉冲\编号],然后根据我当前使用的范围箱访问数组的不同部分

这里有一段摘录:

#define REAL(z,i) ((z)[2*(i)])
#define IMAG(z,i) ((z)[2*(i)+1])

for (i=0; i<rx_length; i++){
    printf("\t[%s] Range bin %i. Samples %i to %i.\n", __FUNCTION__, i, 2*i, 2*i+1);
    for (j=0; j<num_pulses; j++){
        REAL(fft_buf, j) = range_phase_data[2*i][j];
        IMAG(fft_buf, j) = range_phase_data[2*i+1][j];
    }
    printf("\t[%s] Range bin %i done, ready to FFT.\n", __FUNCTION__, i);

    // do stuff with the data
}
定义实(z,i)((z)[2*(i)]) #定义IMAG(z,i)((z)[2*(i)+1])
对于(i=0;iIs)程序开始时已知的文件列表,或者是在程序运行时创建新文件的实时处理?是的,文件为rx_1_out.txt,其中1表示脉冲数。
#define REAL(z,i) ((z)[2*(i)])
#define IMAG(z,i) ((z)[2*(i)+1])

for (i=0; i<rx_length; i++){
    printf("\t[%s] Range bin %i. Samples %i to %i.\n", __FUNCTION__, i, 2*i, 2*i+1);
    for (j=0; j<num_pulses; j++){
        REAL(fft_buf, j) = range_phase_data[2*i][j];
        IMAG(fft_buf, j) = range_phase_data[2*i+1][j];
    }
    printf("\t[%s] Range bin %i done, ready to FFT.\n", __FUNCTION__, i);

    // do stuff with the data
}