鱼C论坛

 找回密码
 立即注册
查看: 794|回复: 4

[已解决]急!求指导思路或者解答

[复制链接]
发表于 2020-5-29 00:25:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
建立两个磁盘文件f1.dat和f2.dat,编程序实现以下工作:
①        从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件中放10个整数);
②        从fl.dat中读入10个数,然后存放到f2.dat文件原有数据的后面;

最佳答案
2020-5-29 02:00:24

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void write_2_files(int *nums, int count, FILE *first, FILE *second) {
  5.     for (int i = 0; i < count; i++) {
  6.         if (0 == (i & 1)) {
  7.             fprintf(first, "%d ", nums[i]);
  8.         } else {
  9.             fprintf(second, "%d ", nums[i]);
  10.         }
  11.     }
  12. }

  13. char *read_all(FILE *f, long *length) {
  14.     fseek(f, 0L, SEEK_END);
  15.     *length = ftell(f);
  16.     fseek(f, 0L, SEEK_SET);
  17.     char *result = (char *) malloc(sizeof(char) * (*length + 1));
  18.     memset(result, 0, sizeof(char) * (*length + 1));
  19.     fread(result, sizeof(char), *length, f);
  20.     return result;
  21. }

  22. char *read_ints(int count, FILE *from) {
  23.     long length = 0;
  24.     char *buffer = read_all(from, &length);
  25.     int begin = 0, end = 0;
  26.     for (begin = 0; begin < length; begin++) {
  27.         char curr = buffer[begin];
  28.         if (curr >= '0' && curr <= '9') {
  29.             break;
  30.         }
  31.     }
  32.     int found = 0;
  33.     for (int i = begin + 1; i < length; i++) {
  34.         char prev = buffer[i - 1];
  35.         char curr = buffer[i];
  36.         if (curr == ' ' && prev >= '0' && prev <= '9') {
  37.             found += 1;
  38.         }
  39.         if (found >= count) {
  40.             end = i;
  41.             break;
  42.         }
  43.     }
  44.     buffer[end] = '\0';
  45.     char *result = strdup(buffer + begin);
  46.     buffer[end] = ' ';
  47.     free(buffer);
  48.     return result;
  49. }


  50. void read_and_append_ints(int count, FILE *to, FILE *from) {
  51.     char *buffer = read_ints(count, from);
  52.     fprintf(to, " %s", buffer);
  53.     free(buffer);
  54. }

  55. void foo(int *nums, const char *expected, int count) {
  56.     FILE *first = fopen("f1.dat", "w+");
  57.     FILE *second = fopen("f2.dat", "w+");
  58.     write_2_files(nums, count, first, second);
  59.     read_and_append_ints((count + 1) / 2, second, first);
  60.     long length = 0;
  61.     char *result = read_all(second, &length);
  62.     if (0 != strcmp(expected, result)) {
  63.         printf("result: %s, expected: %s\n", result, expected);
  64.     }
  65.     free(result);
  66. }

  67. int main() {
  68.     {
  69.         int array[] = {1};
  70.         foo(array, " 1", sizeof(array) / sizeof(array[0]));
  71.     }
  72.     {
  73.         int array[] = {1, 2};
  74.         foo(array, "2  1", sizeof(array) / sizeof(array[0]));
  75.     }
  76.     {
  77.         int array[] = {1, 2, 3};
  78.         foo(array, "2  1 3", sizeof(array) / sizeof(array[0]));
  79.     }
  80.     {
  81.         int array[] = {1, 2, 3, 4};
  82.         foo(array, "2 4  1 3", sizeof(array) / sizeof(array[0]));
  83.     }
  84.     {
  85.         int array[20] = {0};
  86.         for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
  87.             array[i] = i;
  88.         }
  89.         foo(array,
  90.             "1 3 5 7 9 11 13 15 17 19  0 2 4 6 8 10 12 14 16 18",
  91.             sizeof(array) / sizeof(array[0]));
  92.     }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-29 02:00:24 | 显示全部楼层    本楼为最佳答案   

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. void write_2_files(int *nums, int count, FILE *first, FILE *second) {
  5.     for (int i = 0; i < count; i++) {
  6.         if (0 == (i & 1)) {
  7.             fprintf(first, "%d ", nums[i]);
  8.         } else {
  9.             fprintf(second, "%d ", nums[i]);
  10.         }
  11.     }
  12. }

  13. char *read_all(FILE *f, long *length) {
  14.     fseek(f, 0L, SEEK_END);
  15.     *length = ftell(f);
  16.     fseek(f, 0L, SEEK_SET);
  17.     char *result = (char *) malloc(sizeof(char) * (*length + 1));
  18.     memset(result, 0, sizeof(char) * (*length + 1));
  19.     fread(result, sizeof(char), *length, f);
  20.     return result;
  21. }

  22. char *read_ints(int count, FILE *from) {
  23.     long length = 0;
  24.     char *buffer = read_all(from, &length);
  25.     int begin = 0, end = 0;
  26.     for (begin = 0; begin < length; begin++) {
  27.         char curr = buffer[begin];
  28.         if (curr >= '0' && curr <= '9') {
  29.             break;
  30.         }
  31.     }
  32.     int found = 0;
  33.     for (int i = begin + 1; i < length; i++) {
  34.         char prev = buffer[i - 1];
  35.         char curr = buffer[i];
  36.         if (curr == ' ' && prev >= '0' && prev <= '9') {
  37.             found += 1;
  38.         }
  39.         if (found >= count) {
  40.             end = i;
  41.             break;
  42.         }
  43.     }
  44.     buffer[end] = '\0';
  45.     char *result = strdup(buffer + begin);
  46.     buffer[end] = ' ';
  47.     free(buffer);
  48.     return result;
  49. }


  50. void read_and_append_ints(int count, FILE *to, FILE *from) {
  51.     char *buffer = read_ints(count, from);
  52.     fprintf(to, " %s", buffer);
  53.     free(buffer);
  54. }

  55. void foo(int *nums, const char *expected, int count) {
  56.     FILE *first = fopen("f1.dat", "w+");
  57.     FILE *second = fopen("f2.dat", "w+");
  58.     write_2_files(nums, count, first, second);
  59.     read_and_append_ints((count + 1) / 2, second, first);
  60.     long length = 0;
  61.     char *result = read_all(second, &length);
  62.     if (0 != strcmp(expected, result)) {
  63.         printf("result: %s, expected: %s\n", result, expected);
  64.     }
  65.     free(result);
  66. }

  67. int main() {
  68.     {
  69.         int array[] = {1};
  70.         foo(array, " 1", sizeof(array) / sizeof(array[0]));
  71.     }
  72.     {
  73.         int array[] = {1, 2};
  74.         foo(array, "2  1", sizeof(array) / sizeof(array[0]));
  75.     }
  76.     {
  77.         int array[] = {1, 2, 3};
  78.         foo(array, "2  1 3", sizeof(array) / sizeof(array[0]));
  79.     }
  80.     {
  81.         int array[] = {1, 2, 3, 4};
  82.         foo(array, "2 4  1 3", sizeof(array) / sizeof(array[0]));
  83.     }
  84.     {
  85.         int array[20] = {0};
  86.         for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
  87.             array[i] = i;
  88.         }
  89.         foo(array,
  90.             "1 3 5 7 9 11 13 15 17 19  0 2 4 6 8 10 12 14 16 18",
  91.             sizeof(array) / sizeof(array[0]));
  92.     }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-29 12:36:45 | 显示全部楼层

感谢解答!但是不知道为什么我运行的时候有错误C:\Users\lenovo\Desktop
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-29 12:38:13 | 显示全部楼层
优秀的Aurora 发表于 2020-5-29 12:36
感谢解答!但是不知道为什么我运行的时候有错误

'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _strdup. See online help for details.       

'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-29 12:48:37 | 显示全部楼层
优秀的Aurora 发表于 2020-5-29 12:38
'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant na ...

把你的报错信息扔到 google translate 或者 有道词典。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 13:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表