#include <stdio.h>
#include <stdlib.h>
#define RIG 5
#define COL 11
int main()
{
FILE *fp;
fp=fopen("swamp.txt","r");
if((fp=fopen("swamp.txt","r"))==NULL)
{
puts("ERROR!");
return -1;
}
char *swamp[RIG][COL];
while(fscanf(fp,"%s",swamp)!=EOF)
{
printf("%s\n",swamp);
}
fclose(fp);
return 0;
}
我正在使用文件,我在fscanf
内的while
收到2个警告。有人可以向我解释原因吗?
对于test.txt
如下:
aaaaaaa bbbbbbb ccccccc
ddddddd eeeeeee fffffff
ggggggg hhhhhhh iiiiiii
jjjjjjj kkkkkkk lllllll
您可以使用此代码获取数据(它可以处理4行3列中最多8个字符的单词):
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
enum {
ROWS = 4,
COLS = 3
};
FILE *fp;
char test[ROWS][COLS][9];
int counter = ROWS * COLS;
if ((fp = fopen("test.txt", "r")) == NULL) {
perror("fopen()");
return EXIT_FAILURE;
}
for (int i = 0; i < ROWS * COLS; i++) {
if (fscanf(fp, "%8s", test[i / COLS][i % COLS]) == EOF) {
counter = i;
break;
}
}
fclose(fp);
for (int i = 0; i < counter; i++) {
printf("%s ", test[i / COLS][i % COLS]);
if ((i + 1) % COLS == 0) {
printf("\n");
}
}
return EXIT_SUCCESS;
}
让我们假设swamp.txt
包含:
marsh
bog
quagmire
morass
fen
并且您希望在程序中将这些行读入数组swamp
。然后你可以沿着这些方向修改你的代码。请注意,这可以避免在其他清理操作中打开文件两次。
#include <stdio.h>
#define RIG 5
#define COL 11
int main(void)
{
const char filename[] = "swamp.txt";
FILE *fp = fopen(filename, "r");
if (fp == NULL)
{
fprintf(stderr, "failed to open file '%s' for reading\n", filename);
return -1;
}
char swamp[RIG][COL];
int i = 0;
while (i < RIG && fscanf(fp, "%10s", swamp[i]) == 1)
i++;
fclose(fp);
for (int j = 0; j < i; j++)
printf("%d: %s\n", j, swamp[j]);
return 0;
}
输出是:
0: marsh
1: bog
2: quagmire
3: morass
4: fen
请注意,代码通过在读取单词时对其进行计数来防止长文件溢出。你已经检查了fopen()
- 这很好。不过,我改进了错误信息。在我看来,你永远不应该用文字名称的文字字符串调用fopen()
,因为当你在打开文件时报告错误时,你需要在错误信息中输入文件名,所以你必须重复自己。我修复了数组的类型,因此它是char
的2D数组,而不是(未初始化的)char
指针的2D数组。我安排将阵列的每一行依次传递给fscanf()
。我限制了每个单词的输入长度,以防止溢出。