控制台卡在读取文件并过滤数据字符数

时间:2015-11-25 04:41:23

标签: c arrays

运行以下代码时,我没有任何错误。但是在命令控制台上它似乎停留在Processing filename xxxxx上,如下所示。

请问如何使用if条件过滤掉第67行中少于50的数据字符数,我尝试使用strlen(array[count].data) >= 1 && strlen(array[count].data) <= 50但似乎没有用?

  

输入filename:testdata.txt

     

处理文件名testdata.txt ...

Sample Source txt文件:

9001:0002:9003:0021:CLS
0001:0010:0003:0021:CLS
8001:0002:8002:0080:<HTML>
0001:4002:0002:0080:<BODY>
0004:0002:0002:0080:JHJKJBKHJBIUHBKBKHBKHHBKJBKJNKJKHHKUHKJLHBKHBKHBHBHBKHBHBHBHBBHHBHBJKJHKJHKJHKUHIUJ          

源代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
#include <stdlib.h> 
#include <malloc.h>

//struct definition
struct record{
int src;
int dest;
int type;
int port;
char data[100];
};


int main()
{
struct record *array;

FILE* inFile; //file handle or pointer
FILE* outFile;
FILE* errorFile;
char filename[100];

int count = 0;  //keep track of number of records in memory
int i = 0;
int test;
int n1 = 0; //keep track number of correct records
int n2 = 0; //keep track number of error records

array = (struct record *) malloc(sizeof(struct record));

//User to enter filename
printf("Enter filename: ");
scanf("%s", filename);

printf("Processing filename %s ...\n", filename);
inFile = fopen(filename, "r");
if (inFile == NULL) //check if file handler is invalid
{
    printf("Could not open file %s\n", filename);
    exit(1); //error status code
}

test = fscanf(inFile, "%d:%d:%d:%d",
    &array[count].src, &array[count].dest, &array[count].type, &array[count].port);
fgets(array[count].data, 100, inFile);
while (test != EOF){
    count++;
    array = (struct record *) realloc(array, (count + 1)*sizeof(struct record));
    test = fscanf(inFile, "%d:%d:%d:%d:%s",
        &array[count].src, &array[count].dest, &array[count].type, &array[count].port, &array[count].data);
}
fclose(inFile); //must always close file once done

outFile = fopen("data_1.txt", "wt");
errorFile = fopen("data_error.txt", "wt");
if (outFile == NULL) //check if file handler is invalid
{
    printf("Could not write to file \n", filename);
    exit(1);
}

if (count > 0){
    printf("Viewing all records: ", count);
    for (i = 0; i < count; i++){
        if (array[count].src >= 1 && array[count].src <= 1024 && array[count].dest >= 1 && array[count].dest <= 1024 && array[count].type >= 1 && array[count].type <= 10 && array[count].port >= 1 && array[count].port <= 1024)
            n1++;
            fprintf(outFile, "%d %d %d %d",
            (i + 1),
            array[count].src,
            array[count].dest,
            array[count].type,
            array[count].port
            );
    }
}
else
{
    n2++;
    fprintf(errorFile, "%d %d %d %d",
        (i + 1),
        array[count].src,
        array[count].dest,
        array[count].type,
        array[count].port
        );
}

fclose(errorFile);
fclose(outFile);
return 0;
}

1 个答案:

答案 0 :(得分:0)

这有很多常见的错误。你正在读哪本书?

array = (struct record *) malloc(sizeof(struct record));
test = fscanf(inFile, "%d:%d:%d:%d",
&array[count].src, &array[count].dest, &array[count].type, &array[count].port);
fgets(array[count].data, 100, inFile);
while (test != EOF){
    count++;
    array = (struct record *) realloc(array, (count + 1)*sizeof(struct record));
    test = fscanf(inFile, "%d:%d:%d:%d:%s", &array[count].src,  &array[count].dest
                                          , &array[count].type, &array[count].port
                                          , &array[count].data);
}

原谅我。我冒昧地清理了一些你的代码并压缩了一些逻辑。

<强> You shouldn't cast the return value of malloc or realloc

虽然我是关于类型的主题,但是您的编译器是否警告您&array[count].data的类型与%s对应的类型不兼容?不要施展它。只需删除&并识别表示数组的表达式array[count].data如何转换为适当类型的指针。

x = realloc(x, ...);其中x表达式(几乎)始终不正确。你需要使用一个临时变量,这样你就可以正确处理错误而不会泄漏内存(例如下面的代码)......当我讨论realloc用法的主题时,第一个参数可以是NULL和{ {1}}在这种情况下会像realloc那样行事,所以从技术上讲,第一个malloc是不必要的膨胀......

malloc

您是否考虑过struct record *array = NULL; void *temp = realloc(array, (count + 1) * sizeof *array); if (!temp) { puts("ERROR ALLOCATING MEMORY!"); exit(EXIT_FAILURE); } array = temp; fgets之间的区别?您是否知道前者用于阅读,而后者是阅读单词?这可以解释你的问题;当fscanf("%s", ...)看到一个空格时,fscanf正在暂停,将剩下的所有内容留在下一个fscanf调用处理空间之后。结果? fscanf的无限循环失败。

您是否认为并非所有fscanf都无法返回EOF如果您要求fscanf阅读int(使用{{1}并且它会立即遇到非十进制数字,它无法继续进行;发生转换失败

如果您想确保%d成功读取所有5个字段,则需要将返回值与5进行比较,而不是fscanf

我认为你很可能打算在你的四个以冒号分隔的EOF之后阅读行的其余部分,这就是我天真的做法:

int