Ваш цикл копирования не пытается обнаружить EOF. Он должен читать:
int ch;
while ((ch = fgetc(fp)) != EOF)
fputc(ch, fp);
Обратите внимание, что значение считывается в int
, а не в char
. Функции getchar()
, getc()
и fgetc()
возвращают int
, который либо содержит положительное число, представляющее символ (байт), обработанный как unsigned char
, либо возвращает отрицательное значение EOF
(которое обычно, но не обязательно, -1
). Вы не можете сохранить все эти значения в char
; вы должны использовать int
.
Также немного странно просить вашего пользователя ввести имя файла, а затем игнорировать то, что они вводят. В большинстве случаев это так же хорошо, как и вы; вам нужно больше одного char filename1
или char filename2
для хранения имени файла, и вам нужно использовать %s
, а не %c
, чтобы прочитать имена. К счастью, вы используете фиксированные строковые литералы для имен файлов в вызовах fopen()
.
Причина, по которой второй вход, похоже, не дождался, заключается в том, что ваш первый вызов scanf()
читает один символ , поэтому даже если вы введете a
в качестве имени файла, во входной строке также будет указана новая строка. Второй scanf()
читает новую строку. Есть только 3 формата, которые не пропускают ведущее белое пространство (например, новые строки). Это %c
, %[…]
(наборы сканирования) и %n
.
Я верю, что вам нужна структура, когда вы говорите «пара». проверьте, дает ли приведенный ниже код ожидаемый результат.
С DataFrame:
import spark.sqlContext.implicits._
import org.apache.spark.sql.functions._
val data = Seq(("111",5,50000),("222",6,60000),("333",7,60000))
val df = data.toDF("EmpId","Experience","Salary")
val newdf = df.withColumn("EmpId", struct(lit("1").as("key"),col("EmpId").as("value")))
.withColumn("Experience", struct(lit("2").as("key"),col("Experience").as("value")))
.withColumn("Salary", struct(lit("3").as("key"),col("Salary").as("value")))
.show(false)
вывод:
+--------+----------+----------+
|EmpId |Experience|Salary |
+--------+----------+----------+
|[1, 111]|[2, 5] |[3, 50000]|
|[1, 222]|[2, 6] |[3, 60000]|
|[1, 333]|[2, 7] |[3, 60000]|
+--------+----------+----------+
С набором данных:
Сначала вам нужно определить класс дела для новой структуры, иначе вы не сможете создать набор данных
case class Employee2(EmpId: EmpData, Experience: EmpData, Salary: EmpData)
case class EmpData(key: String,value:String)
val ds = df.as[Employee]
val newDS = ds.map(rec=>{
(EmpData("1",rec.EmpId), EmpData("2",rec.Experience.toString),EmpData("3",rec.Salary.toString))
})
val finalDS = newDS.toDF("EmpId","Experience","Salary").as[Employee2]
finalDS.show(false)
Вывод:
+--------+--------+------------+
|EmpId |Experience|Salary |
+--------+--------+------------+
|[1, 111]|[2, 5] |[3, 50000] |
|[1, 222]|[2, 6] |[3, 60000] |
|[1, 333]|[2, 7] |[3, 60000] |
+--------+--------+------------+
Спасибо