我想从文件中获取内容并以随机顺序打印出来。现在我只是尝试从文件中取出内容并将其打印出来。例如,现在文件有:
0 Abdelmeged Zane
1 Attri Sonal
它打印出的第二行不是第一行。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
FILE *file;
char string[50];
char array[100];
int i = 0;
char *p;
file = fopen(argv[1], "r");
if(file == NULL) {
perror("Error opening file");
return(-1);
}
printf("\nOriginal Array: \n");
while(fgets(string, 100, file)!= NULL) {
printf(string);
p = &array[i];
strcpy(p, string);
i++;
}
i = 0;
printf("\nShuffled Array: \n");
while(i < 20){
printf("%c", array[i]);
i++;
}
fclose(file);
return(0);
}
答案 0 :(得分:2)
您的代码存在的问题是,您char array[100];
循环的每次迭代都声明strcpy(p, string);
,然后基本上覆盖您使用while
存储在其中的字符串。在这种情况下,不需要使用指针p
。您需要做的是分配多个指针来保存多个字符串。通常的方法是分配一些指针(下面的10个 - 参见MAXLINES),然后在使用每个指针时为每个字符串分配空间。以下是一个快速示例(请注意,有许多不同的方法可以执行此操作)。此外,由于您正在分配内存,因此您也有责任将其释放(也如下所示)。如果您有疑问,请发表评论。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINES 10
int main(int argc, char* argv[]){
FILE *file;
char string[50];
char **array = NULL;
int i = 0;
if (argc < 2) {
fprintf (stderr, "Error: insufficient input. Usage: %s <filename>\n", argv[0]);
return 1;
}
file = fopen(argv[1], "r");
if(file == NULL) {
perror("Error opening file");
return 1;
}
array = calloc (MAXLINES, sizeof (*array)); /* MAXLINES char pointers */
if (!array) {
fprintf (stderr, "Error: calloc pointer allocation failed\n");
return 1;
}
printf("\nOriginal Array: \n");
while(fgets(string, 100, file)!= NULL) {
printf(" %s", string);
array[i] = strdup (string); /* strdup allocates space for string */
i++;
}
fclose(file); /* close it here, you are done with it */
i = 0; /* print array stored in memory */
printf("\nShuffled Array: \n");
while (array[i])
{
printf(" %s", array[i]);
i++;
}
i = 0;
while (array[i]) /* free memory dynamically allocated: */
{
free (array[i]); /* free array/string memory */
i++;
}
if (array) free (array); /* free pointer allocation */
return 0;
}
注意:您还应该使用fgets
(例如int numlines = i;
)保存循环后读取的字符串数量。在重置i = 0;
之前 之前执行此操作。这样你就可以方便地引用你的shuffle中使用的字符串数量。 (您也可以使用while (array[i])
循环再次计算它们,但为什么?
输入文件:
$ cat dat/abde.txt
0 Abdelmeged Zane
1 Attri Sonal
<强>输出:强>
$ ./bin/shufs dat/abde.txt
Original Array:
0 Abdelmeged Zane
1 Attri Sonal
Shuffled Array:
0 Abdelmeged Zane
1 Attri Sonal
答案 1 :(得分:1)
您正在将读取的字符串复制到第二个char数组中,每次将起点偏移一个。所以最后,假设你没有缓冲区溢出,那么你的array
将把每行的第一个字符保存到最后一个字符,它将完整地保存。
根据您在研究中的位置,创建一个字符数组的静态数组来保存每一行,或创建一个指针数组并malloc
保存的副本。