运行以下代码时,我没有任何错误。但是在命令控制台上它似乎停留在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;
}
答案 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