gpt4 book ai didi

c - 在 C 中读取 csv 文件的不同列

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:08 24 4
gpt4 key购买 nike

我有一个 csv 文件,其中包含 2 个列;时间戳,SNR(整数值)。我必须编写一个首先询问用户输入的函数;用户想要哪个值(value)?示例文件:

 timestamp        ;       SNR   
16:15:12:468 ; 15
16:15:12:968 ; 20

例如:如果我输入SNR,函数应该给我列号。信噪比; (这里是第 2 列)以及 SNR 的值。

Output : Col. no. is 2         
15 /* time difference of ((16:15:12:968)-(16:15:12:458) = 500ms between these two output values*/
20

但是这些值应该作为特定时间间隔的输出给出。这意味着必须首先读取时间戳列,然后计算两个时间戳(当前和下一个)值之间的差异。现在应该将 SNR 作为这两个时间戳值之间的差异间隔的输出给出。我不想使用数组或结构,因为我不想存储值;我只需要这些值在特定时间间隔内传递给其他应用程序。

我写了下面的代码。我可以获得用户输入并输出列号。的文件,但我无法获得这些列的内容。我在我的程序中使用了开关盒,但我不明白为什么这个开关盒不起作用。我还写了一个函数来获取这两个时间戳之间的时间差,但我不知道如何在这个函数中组合它。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#define BUFFER_SIZE 1024
#define num_rows 100

const char* gettime(char* line, int num )
{
const char* tok;
for (tok = strtok(line, ";");tok && *tok;tok = strtok(NULL, ";\n"))
{
if (!num--)
//Sleep(500);
return tok;
}
return NULL;
}
const char* getSNR(char* line, int num )
{
const char* tok;
for (tok = strtok(line, ";");tok && *tok;tok = strtok(NULL, ";\n"))
{
if (!num--)
//Sleep(500);
return atoi(tok);
}
return NULL;
}

struct tm mytime;


int main ()
{
int hh, mm;
float ss, ms;
mytime.tm_year = 2015 - 1900; /* To initialize the struct tm*/
mytime.tm_mon = 6;
mytime.tm_mday = 15;
int count;
int value;
char text[25];
char *buffer;
FILE *fp;
char *token;
char *tok;
char line [100];
char time_buffer[100];
char **timestamp; /*Dynamic allocated array*/
unsigned long ul_second_prev ;
unsigned long ul_second_current;
int i=0, j=0, k=1;
int ui_time_diff, ui_SNR;
time_t time_prev, time_current; /*Dynamic allocated array*/
int timediff ;
timestamp = malloc(num_rows*sizeof(char*));


if ((timestamp)== NULL)
{
printf("Error: out of memory");
}

if ((fp=fopen("testfile.csv", "r"))==NULL)
{
printf ("file cannot be opened");
return 1;
}


buffer = malloc (BUFFER_SIZE); /*Allocate memory in buffer to read the file*/

if (buffer == NULL)
{
printf("Error: Out of Memory");
return 1;
}


fgets(line, BUFFER_SIZE, fp);
printf ("%s", line);
printf ("enter your input\n");
scanf("%s" , &text);
for (tok = strtok(line, ";");tok && *tok;tok = strtok(NULL, ";\n"))
{
value = strcmp (tok, text);
if(value ==0)
printf("col. no. is %d", k);
else k++ ;
}

while (fgets(line, BUFFER_SIZE, fp))
{

char* tmp = strdup(line);

switch (k)
{
case 1:
gettime(tmp, 1);
printf ( "%s",tok );
break;
case 2:
getSNR(tmp, 2);
printf ( "%s",tok );
break;
}
free(tmp);
}

最佳答案

好的,除了无数未使用的变量和至少一个未使用的包含(<windows.h>)之外,gcc 还给出了这些可能指出您的问题的警告:

> gcc -std=c99 -Wall -Wextra -pedantic -oq q.c
q.c: In function ‘getSNR’:
q.c:26:9: warning: return makes pointer from integer without a cast
return atoi(tok);
^
q.c: In function ‘main’:
q.c:84:5: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[25]’ [-Wformat=]
scanf("%s" , &text);
^
q.c:96:5: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration]
char* tmp = strdup(line);
^
q.c:96:17: warning: initialization makes pointer from integer without a cast
char* tmp = strdup(line);
^
q.c:110:1: error: expected declaration or statement at end of input
}
^

你的 getSNR()返回一个整数,但被声明为返回一个字符指针(又名:字符串)。您丢弃返回值并只提供一个(未初始化的!)char *tok (应该是 const 以获取返回值)到 %s格式说明符。

在你的scanf ,除了使用错误的指针类型(这就是警告的内容)之外,还有缓冲区溢出。欢迎 cookies 。 从不使用scanf("%s", ...)没有方法可以判断它将读取多少数据。使用 fgets(text, 25, stdin)在这种情况下。

C编程要学会两点:第一,要准确、严谨,不要飘忽不定。其次,让您的编译器对一切 发出警告(必要时使用适当的开关)。在 98% 的情况下,编译器警告意味着编程错误或错误。

话虽如此,拥有 2 个几乎相同的功能是愚蠢的。做这样的事情:

const char* getfield(char* line, int num )
{
const char* tok;
for (tok = strtok(line, ";");tok && *tok;tok = strtok(NULL, ";\n"))
{
if (!num--)
return tok;
}
return NULL;
}

这个循环仍然有点奇怪,但这是一个风格问题......然后稍后(注意你实际上分配从你的函数返回的值):

while (fgets(line, BUFFER_SIZE, fp))
{
switch (k)
{
case 1:
tok = getfield(line, 1);
printf ( "%s",tok );
break;
case 2:
tok = getfield(line, 2);
printf ( "%d",atoi(tok) );
break;
}
}

还要注意分配的tmp你使用没有任何意义,因为你的 line无论如何,缓冲区都会在循环的下一次迭代中被覆盖。那么为什么要复制一份呢?

关于c - 在 C 中读取 csv 文件的不同列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31653553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com